長連接神器Mina框架的使用
阿新 • • 發佈:2017-05-10
clas rem 服務 bre json字符串 != bin write size
前段時間學習了mina框架的使用。它是基於Socket進行通信,所以說在項目中要是需要長連接的使用,那mina框架是一個不錯的選擇。
下面簡單介紹一下mina框架的使用,學習mina框架不長時間,現在寫下來即時為了記錄一下自己的學習經歷,又希望可以幫助其他初學者朋友,若有不足與錯誤之處,還請大神指教。
在使用mina框架之前需要下載所需的jar包。可以在我的網盤中下載,Android端也可以用的。地址:http://pan.baidu.com/s/1skP8YT3 ,提取碼:inyl。
所需的jar包有:1、log4j-1.2.17.jar 2、mina-core-2.0.0.jar 3、slf4j-api-1.5.11.jar 4、slf4j-simple-1.5.2.jar
服務器端導入這四個jar包,Android端不用導入log4j-1.2.17.jar,它是用來打印log日誌,Android端就不需要加入了。
Android端需要添加網絡訪問權限:
<uses-permission android:name="android.permission.INTERNET" />
服務器端:
1、添加服務器端監聽:
//入口函數
public static void main(String[] args) {
//創建一個NioSocketAcceptor
NioSocketAcceptor acceptor = new NioSocketAcceptor();
//添加過濾
acceptor.getFilterChain().addLast("LineCodec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
//設置Handler,這個handler使我們自己定義的類,需要繼承IoHandlerAdapter
acceptor.setHandler(new MinaServerHandler());
try {
//綁定端口
acceptor.bind(new InetSocketAddress(9999));
} catch (IOException e) {
e.printStackTrace();
}
}
2、創建MinaServerHandler類:
public class MinaServerHandler extends IoHandlerAdapter {
private static List<IoSession> sessions = new ArrayList<>();
//當客戶端與服務器端簡歷連接後會調用sessionCreated,session相當於一個客戶端連接實例,在這裏我們可以保存這個實例
@Override
public void sessionCreated(IoSession session) throws Exception {
super.sessionCreated(session);
//保存session實例
sessions.add(session);
}
//當客戶端與服務器斷開連接是會調用這個方法,在這裏我們可以移除已斷開連接的Session
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
//移除Session實例
sessions.remove(session);
}
/*當客戶端向服務器發送了消息以後,會調用這個方法,message為數據內容
在這裏我們可以對數據進行接收我們可以
*/
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
super.messageReceived(session, message);
//我們可以實時的將消息發送到其他客戶端
for(IoSession is : sessions){
if(!is.equals(session)){
is.write(message);
}
}
//當處理邏輯較多時,如果我們使用json來傳送數據,可以在json中加一個code字段來表示這條消息的類型,並寫一個JsonUtil來進行獲取類型等操作
String json = message.toString();
int code = JsonUtil.getCode(json);
switch(code){
case 1:
//根據json數據做處理
break;
case 2:
//更加json數據做處理
break;
}
}
}
}
Android客戶端:
1、創建NetConnector用於與服務器建立連接
public class NetConnector {
private static IoSession instance = null;
private static IoConnector connector = null;
//獲取Session
public static IoSession getSession(){
if(instance == null){
synchronized(NetConnector.class){
if(instance == null){
instance = createSession();
}
}
}
return instance;
}
//獲取IoSession
private static IoSession createSession() {
L.i("客戶端連接開始!");
connector = new NioSocketConnector();
//設置鏈接超時時間
connector.setConnectTimeoutMillis(30000);
//添加過濾器
connector.getFilterChain().addLast("LineCodec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
minaClientHandler = new MinaClientHandler();
//設置Handler,MinaClientHandler為自己創建的類,繼承自IoHandlerAdapter
connector.setHandler(minaClientHandler);
ConnectFuture future = connector.connect(new InetSocketAddress("192.168.191.194", 9999));//創建鏈接,指定Ip地址與端口號
future.awaitUninterruptibly();// 等待連接創建完成
instance = future.getSession();//獲得session實例
return instance;
}
public static closeConnector(){
if(instance != null){
session.getCloseFuture().awaitUninterruptibly(); //等待關閉連接
}
if(connector != null){
connector.dispose();
}
}
}
2、創建MinaClientHandler類
MinaClientHandler類與服務器端的MinaServerHandler類都是繼承自IoHandlerAdapter。在客戶端中主要是重寫MessageReceived方法用來接收服務器端的消息,我們也可以用為Json字符串添加Code字段來進行消息類型的解析。由於方法是一樣的,在這裏就省略了。
3、向服務器端發送消息
我們通過NetConnector的getInstance()方法得到一個IoSession實例,得到這個實例後,也就與服務器建立了連接,這時我們就可以通過IoSession的write(object)方法想服務器發送消息了。
4、關閉連接
如果現在不需要使用連接,記得關閉哦。 NetConnector.closeConnector();
在這裏mina框架的大概用法就介紹完了,這只是我目前理解並且使用的方法,後邊需要對mina框架做進一步的學習,希望這裏可以對初學者有一些幫助,如果有錯誤的地方,還請聯系我,做進一步的改正,在這裏先謝過各位大神。qq:1362616851
長連接神器Mina框架的使用