解析Mina代码三部曲

  首先,Mina是什么?能帮我们做什么?我研究一个新技术的时候,首先问的就是这样的问题。我个人的理解就是Mina是一个关注于通讯层的框架,任何需要底层通讯的应用,都可以使用它。

  Mina的优势:

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

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

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

  

    publicstaticvoidmain(String[]args)throwsIOException{ //创建AcceptorIoAcceptoracceptor=newNioSocketAcceptor(); //注册filteracceptor.getFilterChain().addLast(“logger”,newLoggingFilter()); acceptor.getFilterChain().addLast(“codec”,newProtocolCodecFilter(newTextLineCodecFactory(Charset.forName(“UTF-8”)))); //注册你的业务处理类acceptor.setHandler(newTimeServerHandler()); //配置参数acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10); //让Acceptor在绑定的地址侦听acceptor.bind(newInetSocketAddress(PORT)); }

  IoHandler

  

    publicinterfaceIoHandler{ voidsessionCreated(IoSessionsession)throwsException; voidsessionOpened(IoSessionsession)throwsException; voidsessionClosed(IoSessionsession)throwsException; voidsessionIdle(IoSessionsession,IdleStatusstatus)throwsException; voidexceptionCaught(IoSessionsession,Throwablecause)throwsException; voidmessageReceived(IoSessionsession,Objectmessage)throwsException; voidmessageSent(IoSessionsession,Objectmessage)throwsException; }

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

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

  看看下面的图便知道了

  

  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(可以理解为线程)同时工作。

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

  

  在这里主要分析IoAcceptor 和 IoProcessor。

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

  

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

  

接受失败,是我们不常听到或看到的一个命题,

解析Mina代码三部曲

相关文章:

你感兴趣的文章:

标签云: