长连接神器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
时间: 2024-10-12 03:22:22

长连接神器Mina框架的使用的相关文章

基于Apache mina 的android 客户端tcp长连接实现

TCP-long-connection-based-on-Apache-mina 基于Apache mina 的tcp长连接实现,可用于android客户端推送. 项目Github地址:https://github.com/sddyljsx/Android-tcp-long-connection-based-on-Apache-mina 项目将Apache的mina项目移植到了android平台.实现长连接的主要思想是使用了mina的KeepAliveFilter过滤器. acceptor.ge

基于分布式Http长连接框架--架构模型

我画了个简单的架构图来帮助说明: 其实为发布订阅架构模式. 生产者和消费者我们统一可理解为客户端,消息中间件可认为是服务端. 生产者和消费者做为客户端要跟服务端交互,则先通过代理订阅服务端,订阅成功后即可跟服务端互通互联,此刻的连接通道为长连接. 长连接的优势在于会将消息主动通知到客户端,避免客户端去做大量的轮询工作而造成资源浪费,而且对于移动应用来说,可较大程度上节省GPRS流量. 当连接建立好后,生产者可随时发送消息,如果在发消息过程当中,服务端由于各种原因不能连接,则消息的发送会回放重试,

基于分布式Http长连接框架--代码模型

好的代码应该是方便客户端使用,代码能够自描述,规范化,大众标准化. 而且我相信代码也是有生命的,需要不断的维护它,你以什么样的态度对待它,它就会以同样的态度回敬你,所以在写代码前,先摆好自己的态度(一个心态良好的创造者),只有这样你的生命才会精彩,代码的生命也会精彩. 前面说了简单的框架模型,简单的设计模型,如果具体到客户端使用的话还需要代码模型来描述下,当作集成的sdk说明即可. 生产者如何发送消息: 1:配置服务端地址及名称; 2:注册本身为客户端,并约定一个全局唯一的名称 3:开启代理 4

基于netty框架的socket长连接负载均衡解决方案

socket通讯的单机瓶颈 物联网的项目socket使用方式有两种: 短连接的socket请求 维持socket长连接的请求 对于socket短链接来说就好比是http请求,请求服务器,服务器返回数据以后请求管道就关闭了,服务器与客户端的链接就释放了.但是对于socket长链接就不同了,当设备与服务器建立连接以后就要一直保持连接,或者说保持较长时间的链接,那么就会大量消耗服务器的资源.若存在大量的这样的请求以后服务器终究会受不了垮掉.通过对TcpClient/server最大连接数我们得知单机s

成为专业程序员路上用到的各种优秀资料、神器及框架

最近想着怎么把自己的知识体系进行整理起来,使用思维导图进行描述,对自己以后的发展也有一个更深的认识,更快的提升自己:看到了下面这篇文章,感觉非常实用,从语言到框架都非常全面,自己也可以继续补充,也是对自己知识体系的一个补充吧. 前言 成为一名专业程序员的道路上,需要坚持练习.学习与积累,技术方面既要有一定的广度,更要有自己的深度. 笔者作为一位tool mad,将工作以来用到的各种优秀资料.神器及框架整理在此,毕竟好记性不如烂键盘,此项目可以作为自己的不时之需. 本人喜欢折腾,记录的东西也比较杂

【真正福利】成为专业程序员路上用到的各种优秀资料、神器及框架

转载,原地址:http://www.cnblogs.com/jasondan/p/6380597.html 据说看到好文章不推荐的人,服务器容易宕机!本文版权归翟士丹(Stan Zhai)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利. 好东西不是随便收集下,发篇博文,骗些点赞的!积累了5年多的东西,是时候放出来跟大家见见面了. 或许有的园友在14年的时候收藏过我的一篇"工欲善其事.必先利其器"的博文,时隔3年,已经

Mina框架项目运用

近期最一个项目对通信要求比較严格,须要建立长连接,且能处理多并发,所以选择了Mina框架.以下就简单记录开发的过程吧: mina 开发须要的jar包: mina pc端通信: 服务端: package cn.ys.net; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFactory; import org.apache.mina.filter.cod

[转载]程序员路上用到的各种优秀资料、神器及框架

好东西不是随便收集下,发篇博文,骗些点赞的!积累了5年多的东西,是时候放出来跟大家见见面了. 或许有的园友在14年的时候收藏过我的一篇"工欲善其事.必先利其器"的博文,时隔3年,已经做了N多更新,那篇文章也已被我删除,迁移至GitHub,重新进行管理. 这篇文章,大家可以推荐.收藏,让更多的人在园内看到,让福利普照. 因为这篇文章,我以后不会更新. 但项目依旧会更新,所以,更好的做法是,请到GitHub上Star:be-a-professional-programmer 前言 成为一名

Apache Mina框架实践

1.为什么要用Apache Mina框架 ApacheMina Server 是一个网络通信应用框架,Mina 可以帮助我们快速开发高性能.高扩展性的网络通信应用,Mina 提供了事件驱动.异步(Mina 的异步IO 默认使用的是JAVANIO 作为底层支持)操作的编程模型. 2.ApacheMina框架使用 Mina的执行流程: > IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立. > IoProcessor:这个接口在另一个线程上