长连接神器Mina框架的使用

前段时间学习了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

posted @ 2017-05-09 23:57  二号程序猿  阅读(931)  评论(0编辑  收藏  举报