1. 程式人生 > >長連接神器Mina框架的使用

長連接神器Mina框架的使用

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框架的使用