zoukankan      html  css  js  c++  java
  • 解析Mina代码三部曲

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

    AD:2013大数据全球技术峰会课程PPT下载

    首先,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是专门暴露给应用开发者,用来填写业务处理代码的。

    看看下面的图便知道了

    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类图


  • 相关阅读:
    Cannot find the class file for java.lang.Object错误
    JAVA 基础 八种数据类型
    获取转发前的uri与jsp:include的uri
    web 应用获取mybatis sqlSessionFactory 扫描保存的的sqlMapper
    Spring MVC 3 试用笔记——helloworld
    Struts2 Plugin 试用笔记
    JavaScript面试题(评解为原创)
    DataSet的Table筛选多条件情况用法
    每日一帖,记录技术点滴
    行内元素和块级元素的区别
  • 原文地址:https://www.cnblogs.com/daichangya/p/12959575.html
Copyright © 2011-2022 走看看