阿飞学习mina框架

1      Mina

Multipurpose Infrastructure Networked Applications):

图1,图2

Mina的工作流程涵盖了它的三个核心接口:IoServiceIoFilter IoHandler

图3

在默认情况 IoProcessor会用 N+1 个线程来轮流询问监视的端口是否有数据传送,其中 n cpu 的内核个数

第一步:创建服务对象(客户端或者服务器端)--IoService接口

第二步:数据过滤(编码解码、日志等)      --IoFilter接口

第三步:业务处理                          --IoHandle接口

1.1      IoService接口:

作用:IoService是创建服务的顶层接口,无论客户端还是服务端,都是从它继承实现的。

IoService接口声明了服务端的共有属性和行为;

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

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

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

 图4

创建非阻塞的服务器端:SocketAcceptor acceptor = new NioSocketAcceptor( );

publicfinalclass NioSocketAcceptorextends AbstractPollingIoAcceptor

    implements SocketAcceptor

publicabstractclass AbstractPollingIoAcceptorextends AbstractIoAcceptor

创建客户端:SocketConnector connector = new NioSocketConnector( );

publicfinalclass NioSocketConnectorextends AbstractPollingIoConnector

implements SocketConnector

publicabstractclass AbstractPollingIoConnectorextends AbstractIoConnector

所以:IoService是创建服务的顶层接口,无论客户端还是服务端,都是从它继承实现的。

1.2      IoFilter接口:

以服务器端为例:

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

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

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

ExecutorFilter IO线程与业务处理线程分开,I/O Processor的线程数量由CPU的核数决定,由于业务处理部分消耗时间过长,如果和IO线程在一个里面会造成阻塞。

ExecutorFilter 缺省使用OrderedThreadPoolExecutor线程池。

需要注意的是这个线程池,对应同一个session而言,是顺序执行的.

1.3      IoHandler接口

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

ü  sessionCreated:当一个新的连接建立时,由I/O processor thread调用;

ü  sessionOpened:当连接打开是调用;

ü  messageReceived:当接收了一个消息时调用;

ü  messageSent:当一个消息被(IoSession#write)发送出去后调用;

ü  sessionIdle:当连接进入空闲状态时调用;

ü  sessionClosed:当连接关闭时调用;

ü  exceptionCaught:当实现IoHandler的类抛出异常时调用;

一般情况下,我们最关心的只有messageReceived方法,接收消息并处理,然后调用IoSessionwrite方法发送出消息!(注意:这里接收到的消息都是Java对象,在IoFilter中所有二进制数据都被解码啦!

一般情况下很少有人实现IoHandler接口,而是继承它的一个实现类IoHandlerAdapter,这样不用覆盖它的7个方法,只需要根据具体需求覆盖其中的几个方法就可以!

 

猜你喜欢

转载自blog.csdn.net/feelwing1314/article/details/8604685
今日推荐