mina分析

 

      Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。
 
mina分析_第1张图片

 

 Mina的工作流程,也涵盖了Mina的三个核心接口:IoService接口,IoFilter接口和IoHandler接口

  • 第一步. 创建服务对象(客户端或服务端)  ---IoService接口实现
  •  第二步. 数据过滤(编码解码、日志等)    ---IOFilter接口实现
  • 第三步. 业务处理                                       ---IoHandler接口实现

 

  1. IoService接口

作用:IoService是创建服务的顶层接口,无论客户端还是服务端,都是从它继承实现的。 IoService接口声明了服务端的共有属性和行为。

 

       IoAcceptor接口继承了IoService接口,并添加了服务端特有的接口属性及方法,比如bind()方法,成为典型的服务端接口;
       IoConnector接口同样继承了IoService接口,并添加了客户端特有的接口属性及方法,比如connect()方法,成为典型的客户端接口; 

 实现类有NioSocketAcceptor(服务端),NioSocketConnector(客户端)

 


mina分析_第2张图片
 

启动服务端的时候 通过acceptor.getFilterChain()的addLast方法添加IOFilter

通过acceptor.seHandler添加IoHandler

 服务端必须指定绑定的端口号

 客户端必须指定请求的服务器地址和端口号

 

2.IoFilter接口

Mina最主要的工作就是把底层传输的字节码转换为Java对象,提供给应用程序;或者把应用程序返回的结果转换为字节码,交给底层传输。这些都是由IoFilter完成的,因此IoFilter是Mina的精髓所在。

IoService实例会绑定一个DefaultIoFilterChainBuilder ---- 过滤器链,我们把自定义的各种过滤器(IoFilter)自由的插放在这个过滤器链上了,类似于一种可插拔的功能!


mina分析_第3张图片

 

LoggingFilter是根据IoSession的状态(创建、开启、发送、接收、异常等等)来记录会话的事件信息的!这对我们跟踪IoSession很有用。当地,也可以自定义logger的日志级别,定义记录那些状态的日志。

 ProtocolCodecFilter是设置编码解码。Mina中传输的所有二进制信息都存放在IoBuffer中,IoBuffer是对Java NIO中ByteBuffer的封装(Mina2.0以前版本这个接口也是ByteBuffer),提供了更多操作二进制数据,对象的方法,并且存储空间可以自增长,用起来非常方便;简单理解,它就是个可变长度的byte数组!

ExecutorFilter 将IO线程与业务处理线程分开,I/O Processor的线程数量由CPU的核数决定,由于业务处理部分消耗时间过长,如果和IO线程在一个里面会造成阻塞。
ExecutorFilter 缺省使用OrderedThreadPoolExecutor线程池。
需要注意的是这个线程池,对应同一个session而言,是顺序执行的。

 

3.IoHandler接口

 IoHandler是Mina实现其业务逻辑的顶级接口;在IoHandler中定义了7个方法,根据I/O事件来触发对应的方法:

  • sessionCreated:当一个新的连接建立时,由I/O processor thread调用;
  • sessionOpened:当连接打开是调用;
  • messageReceived:当接收了一个消息时调用;
  • messageSent:当一个消息被(IoSession#write)发送出去后调用;
  • sessionIdle:当连接进入空闲状态时调用;
  • sessionClosed:当连接关闭时调用;
  • exceptionCaught:当实现IoHandler的类抛出异常时调用;

 

一般情况下,我们最关心的只有messageReceived方法,接收消息并处理,然后调用IoSession的write方法发送出消息!(注意:这里接收到的消息都是Java对象,在IoFilter中所有二进制数据都被解码啦!)
一般情况下很少有人实现IoHandler接口,而是继承它的一个实现类IoHandlerAdapter,这样不用覆盖它的7个方法,只需要根据具体需求覆盖其中的几个方法就可以!

4.mina与传统socket的区别

 

  • 传统的socket

 

    传统socket:阻塞式通信(IO)。每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。就好比,一个客户去商店订购商品,而商店专门派一个服务员来招呼这位客户,一直待客户将商品取走。

 

  • mina

 

      mina采用的是非阻塞通讯模式(NIO)。NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。 

反应器模式的核心功能如下:将事件分派到各自相应的事件处理程序

NIO 的非阻塞 I/O 机制是围绕 选择器和 通道构建的。Channel 类表示服务器和客户机之间的一种通信机制。Selector 类是 Channel 的多路复用器。 Selector 类将传入客户机请求多路分用并将它们分派到各自的请求处理程序。
通道(Channel 类):表示服务器和客户机之间的一种通信机制。 
选择器(Selector类):是 Channel 的多路复用器。

Selector 类将传入的客户机请求多路分用并将它们分派到各自的请求处理程序。简单的来说:NIO是一个基于事件的IO架构,最基本的思想就是:有事件我通知你,你再去做你的事情.而且NIO的主线程只有一个,不像传统的模型,需要多个线程以应对客户端请求,也减轻了JVM的工作量。
当Channel注册至Selector以后,经典的调用方法如下:nio中取得事件通知,就是在selector的select事件中完成的。在selector事件时有一个线程向操作系统询问,selector中注册的Channel&&SelectionKey的键值对的各种事件是否有发生,如果有则添加到selector的selectedKeys属性Set中去,并返回本次有多少个感兴趣的事情发生。如果发现这个值>0,表示有事件发生,马上迭代selectedKeys中的SelectionKey,根据Key中的表示的事件,来做相应的处理。实际上,这段说明表明了异步socket的核心,即异步socket不过是将多个socket的调度(或者还有他们的线程调度)全部交给操作系统自己去完成,异步的核心Selector,不过是将这些调度收集、分发而已。

你可能感兴趣的:(Mina)