设为首页 收藏本站
查看: 745|回复: 0

[经验分享] Apache Mina框架实践

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-1 09:07:28 | 显示全部楼层 |阅读模式
1.为什么要用Apache Mina框架
ApacheMina Server 是一个网络通信应用框架,Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVANIO 作为底层支持)操作的编程模型。
2.ApacheMina框架使用
Mina的执行流程:
      > IoService这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立。
      > IoProcessor这个接口在另一个线程上,负责检查是否有数据在通道上读写,也就是说它也拥有自己的Selector,这是与我们使用JAVA NIO 编码时的一个不同之处,通常在JAVA NIO 编码中,我们都是使用一个Selector,也就是不区分IoService与IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在IoService 上的过滤器,并在过滤器链之后调用IoHandler。
      >IoFilter这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write方向)与解码(read 方向)等功能,其中数据的encode 与decode是最为重要的、也是你在使用Mina 时最主要关注的地方。
      >IoHandler这个接口负责编写业务逻辑,也就是接收、发送数据的地方。
3.ApacheMina框架实例
       该实例是WIFI云管理平台的实际运用,主要实现通过和WIFI保持长连接管理WIFI,贴出部分代码:
      >服务器端UDPDispatcher.java
      public class UDPDispatcher extendsHttpServlet implements ServletContextListener{
      
      private static final int PORT =20000;
        /** 30秒后超时 */
      private static final int IDELTIMEOUT =30;
      private static final longserialVersionUID = -4384594559203991221L;
      @Override
      public voidcontextInitialized(ServletContextEvent sce) {
             NioDatagramAcceptor acceptor = newNioDatagramAcceptor();// 创建一个UDP的接收器
             acceptor.setHandler(newUDPHandler());// 设置接收器的处理程序
             Executor threadPool = newOrderedThreadPoolExecutor(100);// 建立线程池
             acceptor.getFilterChain().addLast("exector",newExecutorFilter(threadPool));
             acceptor.getFilterChain().addLast("logger",new LoggingFilter());
             /*******心跳请求设置 begin*********/
             KeepAliveMessageFactoryheartBeatFactory = new KeepAliveMessageFactoryImpl();
             KeepAliveFilter heartBeat = newKeepAliveFilter(heartBeatFactory,
               IdleStatus.BOTH_IDLE,KeepAliveRequestTimeoutHandler.CLOSE);
             //设置是否forward到下一个filter
             heartBeat.setRequestTimeoutHandler(newKeepAliveRequestTimeoutHandlerImpl());
       heartBeat.setForwardEvent(true);
       //设置心跳频率
       heartBeat.setRequestInterval(20);
       heartBeat.setRequestTimeout(60);
       acceptor.getFilterChain().addLast("heartbeat",heartBeat);
             /*******心跳请求设置 end  *********/
             DatagramSessionConfig dcfg =acceptor.getSessionConfig();// 建立连接的配置文件
             dcfg.setReadBufferSize(4096);// 设置接收最大字节默认2048
             dcfg.setReceiveBufferSize(1024);//设置输入缓冲区的大小
             dcfg.setSendBufferSize(1024);// 设置输出缓冲区的大小
             dcfg.setReuseAddress(true);// 设置每一个非主监听连接的端口可以重用
             dcfg.setIdleTime(IdleStatus.BOTH_IDLE,IDELTIMEOUT);
             try {
                    // 绑定端口
                    acceptor.bind(newInetSocketAddress(UDPConfigUtil.getHost(),PORT));
             } catch (IOException e) {
                    // TODO Auto-generatedcatch block
                    e.printStackTrace();
             }
       }
      @Override
      public voidcontextDestroyed(ServletContextEvent sce) {
             // TODO Auto-generated method stub
       }
}
      >心跳机制处理KeepAliveMessageFactoryImpl.java
      public void messageSent(IoSessionsession, Object message) throws Exception {
      }
      
      @Override
      public void exceptionCaught(IoSessionsession, Throwable cause)
         throws Exception {
        logger.error(cause);
        session.close(true);
      }
      
      @Override
    public voidmessageReceived(IoSessionsession, Object message) throws Exception {
            logger.info("messageReceived");
       if (message instanceof IoBuffer) {
             IoBuffer buffer = (IoBuffer)message;
             UDPRequestServer controller =UDPRequestServer.getInstance();
                   IoBuffer buffer1 =controller.dealRequest(buffer);
                   session.write(buffer1);
       }
         
    }
}
      >业务逻辑处理UDPHandler.java
publicclass UDPHandler extends IoHandlerAdapter {
      
       private final Logger logger =Logger.getLogger(this.getClass());
         
       @Override
       public void messageSent(IoSessionsession, Object message) throws Exception {
       }  
         
       @Override
       public void exceptionCaught(IoSessionsession, Throwable cause)  
          throws Exception {  
         logger.error(cause);
         session.close(true);  
       }  
         
       @Override
    public void messageReceived(IoSessionsession, Object message) throws Exception {
             logger.info("messageReceived");  
        if (message instanceof IoBuffer) {  
              IoBuffer buffer = (IoBuffer) message;
              UDPRequestServer controller = UDPRequestServer.getInstance();
                   IoBuffer buffer1 =controller.dealRequest(buffer);
                   session.write(buffer1);  
        }
         
    }  
}
注意点:
      >心跳机制:
      (1)客户端会定时发送心跳请求(注意定时时间必须小于,服务器端的IDLE监控时间),同时需要监听心跳反馈,以此来判断是否与服务器丢失连接。对于服务器的心跳请求不给与反馈。
      (2)心跳情况在60秒之内
      (3)客户端和服务端同时都需要设置心跳请求



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145689-1-1.html 上篇帖子: clickjacking:X-frame-options header missing 漏洞解决办法 下篇帖子: apache 限制某些目录不能访问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表