JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)

转载 2012年05月09日 13:04:16

Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。Apache MINA 2 可以作为开发网络应用程序的一个良好基础。

    Apache MINA是非常著名的基于java nio的通信框架,以前都是自己直接使用udp编程,新项目选型中考虑到网络通信可能会用到多种通信方式,因此使用了MINA。

     本文结构:

     (1)客户端和服务器代码 ;虽然是udp的,但是mina的优美的设计使得所有的通信方式能够以统一的形式使用,perfect。当然注意的是,不同的通信方式,背后的机理和有效的变量、状态是有区别的,所以要精通,那还是需要经验积累和学习的。

     (2)超时 和Session的几个实际问题

     (3)心跳 ,纠正几个错误

 

     既然是使用,废话少说,直接整个可用的例子。当然了,这些代码也不是直接可用的,我们应用的逻辑有点复杂,不会这么简单使用的。

请参考mina的example包和文档http://mina.apache.org/udp-tutorial.html

 

版本2.0 RC1

1.1 服务器端

  1.                 NioDatagramAcceptor acceptor =  new  NioDatagramAcceptor();  
  2.                 acceptor.setHandler(new  MyIoHandlerAdapter()); //你的业务处理,最简单的,可以extends IoHandlerAdapter   
  3.   
  4. DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();  
  5. chain.addLast("keep-alive" new  HachiKeepAliveFilterInMina());  //心跳   
  6. chain.addLast("toMessageTyep" new  MyMessageEn_Decoder());   
  7.               //将传输的数据转换成你的业务数据格式。比如下面的是将数据转换成一行行的文本   
  8.                 //acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));    
  9.   
  10. chain.addLast("logger" new  LoggingFilter());  
  11. DatagramSessionConfig dcfg = acceptor.getSessionConfig();  
  12. dcfg.setReuseAddress(true );  
  13. acceptor.bind(new  InetSocketAddress(ClusterContext.getHeartBeatPort()));  

 

 

1.2 客户端

  1.               NioDatagramConnector connector =  new  NioDatagramConnector();  
  2. connector.setConnectTimeoutMillis(60000L);  
  3. connector.setConnectTimeoutCheckInterval(10000 );  
  4. connector.setHandler(handler);  
  5.   
  6. DefaultIoFilterChainBuilder chain = connector.getFilterChain();  
  7. chain.addLast("keep-alive" new  HachiKeepAliveFilterInMina()); //心跳   
  8. chain.addLast("toMessageTyep" new  MyMessageEn_Decoder());  
  9. chain.addLast("logger" new  LoggingFilter());  
  10. ConnectFuture connFuture = connector.connect(new  InetSocketAddress( "10.1.1.1" , 8001 ));  
  11. connFuture.awaitUninterruptibly();  
  12. IoSession session = connFuture.getSession();  
  13.                 //发送消息长整型 1000   
  14.               IoBuffer buffer = IoBuffer.allocate(8 );  
  15.               buffer.putLong(1000 );  
  16.               buffer.flip();  
  17.               session.write(buffer);  
  18.                  //关闭连接   
  19.                  session.getCloseFuture().awaitUninterruptibly();  
  20.  connector.dispose();  

 

2. 超时的几个经验总结:

    udp session默认是60秒钟超时,此时状态为closing,数据就发不出去了。

Session的接口是IoSession,udp的最终实现是NioSession。如果交互在60秒内不能处理完成,就需要使用Keep-alive机制,即心跳机制。

 

3. 心跳 机制

    在代码中已经使用了心跳机制,是通过mina的filter实现的,mina自身带的心跳机制好处在于,它附加了处理,让心跳消息不会传到业务层,在底层就完成了。

    在上面代码实现中的HachiKeepAliveFilterInMina如下:

 

  1. public   class  HachiKeepAliveFilterInMina  extends  KeepAliveFilter {  
  2.     private   static   final   int  INTERVAL =  30 ; //in seconds   
  3.     private   static   final   int  TIMEOUT =  10 //in seconds   
  4.       
  5.     public  HachiKeepAliveFilterInMina(KeepAliveMessageFactory messageFactory) {  
  6.         super (messageFactory, IdleStatus.BOTH_IDLE,  new  ExceptionHandler(), INTERVAL, TIMEOUT);  
  7.     }  
  8.       
  9.     public  HachiKeepAliveFilterInMina() {  
  10.         super ( new  KeepAliveMessageFactoryImpl(), IdleStatus.BOTH_IDLE,  new  ExceptionHandler(), INTERVAL, TIMEOUT);  
  11.         this .setForwardEvent( false );  //此消息不会继续传递,不会被业务层看见   
  12.     }  
  13. }  
  14.   
  15. class  ExceptionHandler  implements  KeepAliveRequestTimeoutHandler {     
  16.     public   void  keepAliveRequestTimedOut(KeepAliveFilter filter, IoSession session)  throws  Exception {     
  17.         System.out.println("Connection lost, session will be closed" );     
  18.         session.close(true );   
  19.     }     
  20. }  
  21.   
  22. /**  
  23.  * 继承于KeepAliveMessageFactory,当心跳机制启动的时候,需要该工厂类来判断和定制心跳消息  
  24.  * @author Liu Liu  
  25.  *  
  26.  */   
  27. class  KeepAliveMessageFactoryImpl  implements  KeepAliveMessageFactory {  
  28.     private   static   final   byte  int_req = - 1 ;  
  29.     private   static   final   byte  int_rep = - 2 ;   
  30.     private   static   final  IoBuffer KAMSG_REQ = IoBuffer.wrap( new   byte []{int_req});     
  31.     private   static   final  IoBuffer KAMSG_REP = IoBuffer.wrap( new   byte []{int_rep});    
  32.          
  33.     public  Object getRequest(IoSession session) {     
  34.         return  KAMSG_REQ.duplicate();     
  35.     }     
  36.   
  37.     public  Object getResponse(IoSession session, Object request) {     
  38.         return  KAMSG_REP.duplicate();     
  39.     }     
  40.   
  41.     public   boolean  isRequest(IoSession session, Object message) {    
  42.         if (!(message  instanceof  IoBuffer))  
  43.             return   false ;  
  44.         IoBuffer realMessage = (IoBuffer)message;  
  45.         if (realMessage.limit() !=  1 )  
  46.             return   false ;  
  47.           
  48.         boolean  result = (realMessage.get() == int_req);  
  49.         realMessage.rewind();  
  50.         return  result;  
  51.     }     
  52.   
  53.     public   boolean  isResponse(IoSession session, Object message) {      
  54.         if (!(message  instanceof  IoBuffer))  
  55.             return   false ;  
  56.         IoBuffer realMessage = (IoBuffer)message;  
  57.         if (realMessage.limit() !=  1 )  
  58.             return   false ;  
  59.           
  60.         boolean  result = (realMessage.get() == int_rep);     
  61.         realMessage.rewind();  
  62.         return  result;  
  63.     }     
  64. }  

 

  有人说:心跳机制的filter只需要服务器端具有即可——这是错误 的,拍着脑袋想一想,看看factory,你就知道了。心跳需要通信两端的实现

  另外,版本2.0 RC1中,经过测试,当心跳的时间间隔INTERVAL设置为60s(Session的存活时间)的时候心跳会失效,所以最好需要小于60s的间隔。

 

更多可参考:

http://www.ibm.com/developerworks/cn/java/j-lo-mina2

NIO通讯框架之阿堂教程:Mina学习笔记-入门篇(一)

在两三年前,阿堂在技术博客(http://blog.sina.com.cn/heyitang) 上曾经写过"JAVA新I/O学习系列笔记(1)"和"JAVA新I/O学习系列笔记(2)"两篇学习笔记...
  • younger_z
  • younger_z
  • 2015年09月08日 11:29
  • 1350

Mina开源框架 心跳机制详解

本文纯手工制作,请用心观看。 在详细讲解mina的心跳机制前,读者需要已经具备了mina的基础知识。 如果不够了解,请查看一下连接。 http://www.cnblogs.com/pricks/p/3...
  • kkk0526
  • kkk0526
  • 2016年06月22日 11:43
  • 7403

高并发Socket通信框架——Mina

一、定义 mina框架是基于TCP/IP,UDP/IP协议的通信框架。 二、执行流程 由上至下分别是IoHandler、IoFilter、IoProcessor、IoServ...
  • a_lwh____
  • a_lwh____
  • 2017年05月14日 04:11
  • 508

Java异步NIO框架Netty实现高性能高并发

1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点...
  • gaowenhui2008
  • gaowenhui2008
  • 2017年02月13日 09:33
  • 8903

mina 添加心跳包

1.检测心跳包的关键代码如下:setKeepAliveRequestInterval(30);定时进入IoHandlerAdapter子类的sessionIdle(IoSession session,...
  • rongrong_love_lc
  • rongrong_love_lc
  • 2017年05月08日 12:27
  • 353

socket 通信的解决方案-Mina框架的使用心得及相关要点

前言 笔者之前的工作主要是做 java 的 web 端开发,后因工作原因参与了一个国家级的大项目,主要负责其中底层通讯的前置机模块。几经波折,将该系统完成后,结果在第一轮的测试中就惨败退回。其根本原...
  • libing13810124573
  • libing13810124573
  • 2016年04月21日 10:35
  • 2066

NIO框架之MINA源码解析(五):NIO超级陷阱和使用同步IO与MINA通信

1、NIO超级陷阱之所以说NIO超级陷阱,就是因为我在本系列开头的那句话,因为使用缺陷导致客户业务系统瘫痪。当然,我对这个问题进行了很深的追踪,包括对MINA源码的深入了解,但其实之所以会出现这个问题...
  • MINEZHANGHAO
  • MINEZHANGHAO
  • 2014年09月15日 07:56
  • 4369

用MINA实现UDP通信的例子

1、UDPClient.java import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.ap...
  • polo_longsan
  • polo_longsan
  • 2015年11月29日 11:40
  • 2207

UDP异步通信C#

C# 编写的简单UDP异步通信程序(控制台) 客户端发送请求,服务器端响应机制 1. [代码]UDP客户端代码     01 using System;...
  • Baple
  • Baple
  • 2014年04月15日 15:27
  • 5745

使用Mina框架实现C/S通讯

什么是Mina? Apache MINA is a network application framework which helps users develop... Apache MINA是一...
  • linchaolong
  • linchaolong
  • 2015年06月11日 23:26
  • 4047
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)
举报原因:
原因补充:

(最多只允许输入30个字)