解析Mina代码三部曲
创始人
2024-07-22 16:00:30
0

首先,Mina是什么?能帮我们做什么?我研究一个新技术的时候,首先问的就是这样的问题。我个人的理解就是Mina是一个关注于通讯层的框架,任何需要底层通讯的应用,都可以使用它。更详细准确的介绍,请看官方网站http://mina.apache.org/

Mina的优势:

1. 用NIO实现,无需太多线程。可以处理的并发量更大。

2. 对于应用层来说,编程更方便。

好了废话少说,先看个Demo吧

 

  1. public static void main(String[] args) throws IOException {  
  2.     // 创建Acceptor   
  3.     IoAcceptor acceptor = new NioSocketAcceptor();  
  4.  
  5.     // 注册filter   
  6.    acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );  
  7.    acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));  
  8.  
  9.     // 注册你的业务处理类   
  10.     acceptor.setHandler( new TimeServerHandler() );  
  11.  
  12.     // 配置参数   
  13.     acceptor.getSessionConfig().setReadBufferSize( 2048 );  
  14.     acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );  
  15.  
  16.     // 让Acceptor在绑定的地址侦听   
  17.     acceptor.bind( new InetSocketAddress(PORT) );  
  18. }  

 

IoHandler
  1. public interface IoHandler {  
  2.  
  3.      void sessionCreated(IoSession session) throws Exception;  
  4.  
  5.      void sessionOpened(IoSession session) throws Exception;  
  6.  
  7.      void sessionClosed(IoSession session) throws Exception;  
  8.  
  9.      void sessionIdle(IoSession session, IdleStatus status) throws Exception;  
  10.  
  11.      void exceptionCaught(IoSession session, Throwable cause) throws Exception;  
  12.  
  13.      void messageReceived(IoSession session, Object message) throws Exception;  
  14.  
  15.      void messageSent(IoSession session, Object message) throws Exception;  
  16. }   

首先new一个Acceptor,可以看出,Acceptor是我们要操作的服务器对象。然后,向Acceptor里注册了两个filter。filter的概念类似于web服务器里的filter。filter处于你的业务端代码和具体的发送数据代码之间,它负责过滤或者说处理传递过来的信息。业务处理代码,写在Handler里。

代码结构相当的清晰。我们需要填写的业务代码就是 Handler 和 Filter了。它们俩很相似,但是在概念上是有区别的。filter事实上主要是处理底层的通信字节流,通信协议等,一般跟业务逻辑没什么关系。Handler是专门暴露给应用开发者,用来填写业务处理代码的。

看看下面的图便知道了

 

 

#p#

Mina暴露给开发者的接口主要是IoAcceptor(服务器端)或者IoConnector(客户端)。Mina内部具体是怎么实现侦听,处理连接的呢?我们先来介绍一下Mina的方法哲学或者说术语吧。

IoSession

IoSession: IoSession是一个客户连接的抽象,整个通讯框架可以说,都是围绕着IoSession工作的。

IoAcceptor: 初始化服务器,用的就是它

IoProcessor: 负责处理IoSession,包括创建,移除,读写事件的处理

IoFilter: 过滤消息或者说消息处理(通讯层的)

IoHandler: 消息处理(应用逻辑层的)

通讯层的核心类,事实上是IoAcceptor,IoProcessor,IoSession。在这里我们只分析IoAcceptor模式,也就是服务器端的代码。客户端的代码与此类似,大家可以自己研究。

首先,调用IoAcceptor.bind()方法时,服务器已经初始化完毕,这时服务器就在指定的端口上开始侦听客户端发来的连接请求。

当IoAcceptor侦听到客户端请求时,它就会把这个请求交给IoProcessor进行处理。然后IoAcceptor回去继续侦听。显然,IoAcceptor的工作流程就是 侦听 --> 传递请求 --> 继续侦听。

IoProcessor得任务则是处理这些连接的IO事件。显然IoProcessor不可能和IoAcceptor在同一个线程里运行。他们两个分工不同,可以并发执行。Mina内部事实上维护了一个IoProcessor对象池,对象池的默认大小是CPU个数+1.也就是说,如果你的机器是4核的,可能就有5个IoProcessor(可以理解为线程)同时工作。

看看下面的示意图吧,一图胜千言:

 

 

 

 

#p#

在这里主要分析IoAcceptor 和 IoProcessor。

IoAcceptor比较简单,它的核心代码都在AbstractPollingAccetor里,轮询代码在它的内部类Accetpor里的run方法里。请看下面的UML图:

 

 

IoProcessor比较复杂,它的主要代码是在AbstractPollingProcessor里的,轮询代码在它的内部类Processor里的run方法实现。值得注意的是,IoAcceptor所持有的IoProcessor引用,事实上是一个对象池。对象池负责调度某个Processor来处理请求。下面是UML类图

 

【编辑推荐】

  1. 巧解使Eclipse崩溃的JVM terminated问题
  2. JVM terminated令Eclipse崩溃问题的解决
  3. Java编译过程与c/c++编译过程有何不同
  4. 浅谈jvm.dll装载过程与源代码分析
  5. Java虚拟机(JVM)中的内存设置详解

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...