天天看点

MIna框架I/O Service层设计

mina从2.0版本以后,它的设计让人感觉到非常的优雅。它对网络应用通信框架的3个层进行了更好的抽象,以及在功能逻辑上的划分,同时又保证了 作为一个网络应用通信框架的统一。划分的3个层分别为:

i/o service层

i/o filter chain层

i/o handler层

这里,我们重点关注i/o service层。作为一个基于网络通信的应用,无论是服务器还是客户端角色,都要和网络i/o打交道,比如,服务器端需要创建服务器端socket,监听指定端口并等待请求的带来,而客户端需要连接到服务器端指定的监听端口,使用网络服务。一般来说,这些i/o操作都比较复杂,而且很难在编 码中进行很好地控制,mina的i/o service层就是处理这些与实际的网络i/o相关的操作(事件)。

我们先看一下,对于服务器端和客户端,i/o service层是如何设计的。类设计上的关系,作为这一层的最顶层抽象就是ioservice接口类,如图所示:

MIna框架I/O Service层设计

通过上图,我们可以看到,ioservice抽象的服务(功能)有如下几个:

管理iosession:创建和删除iosession,探测会话idle状态

filter chain管理:处理过滤器链,允许用户修改过滤器链执行顺序

handler的调用:当指定事件发生的时候,负责调用handler进行处理

统计数据管理:更新消息发生的数量,以及传输的字节数,等等

监听器管理:管理用户设置的listener

通信管理:管理端到端数据传输

具体可以参考源代码中定义的方法。

下面看看在服务器端和客户端,mina是如何使用ioservice进行抽象和设计的。

服务器端i/o service层

在服务器端,对应于该层的抽象是ioacceptor接口,ioacceptor继承自ioservice。具体的类设计上的关系,如图所示:

MIna框架I/O Service层设计

上图中,主要基于网络传输层协议tcp和udp内置了对应ioacceptor的实现,还附加了另外两个,如下所示:

niosocketacceptor

niodatagramacceptor

aprsocketacceptor

vmpipesocketacceptor

根据实现类的命名就可知道各个类对应的应用场景。这里要说的是,前两个niosocketacceptor和niodatagramacceptor 都是基于非阻塞socket的。aprsocketacceptor是基于apr(apache portable run-time)的阻塞 socket实现。

客户端i/o service层

在客户端,对应于该层的抽象是ioconnector接口,ioconnector继承自ioservice。具体的类设计上的关系,如图所示:

MIna框架I/O Service层设计

上图中给出了ioconnector的6个实现,如下所示:

niosocketconnector

niodatagramconnector

aprsocketconnector

proxyconnector

serialconnector

vmpipeconnector

上面的proxyconnector是提供了代理支持的ioconnector,serialconnector是支持串行传输数据的 ioconnector,vmpipeconnector就是in-vm的ioconnector。