Mina框架IoService通用抽象服务详解

  • 时间:
  • 浏览:2

都不可以 看出,里面方式中的IoSessionAttributeMap和WriteRequestQueue都不 与有一兩个 IoSession相 关的数据对象,大伙儿都不可以 看一下,这几只类之间的关系,如图所示:

实际上最终在调用构建的方式buildFilterChain的以前,将以前组织到DefaultIoFilterChainBuilder 实例中的多个IoFilter实例加在到以前构造的IoFilterChain中(如默认的DefaultIoFilterChain),一 个IoFilterChain实例都不可以 在IoService实例运行时被使用,下面是buildFilterChain方式的逻辑:

也假使 说,IoFilterChainBuilder是供使用Mina框架的开发网络守护进程的人员组织IoFilter链的,它假使 有一兩个 运行前构建工具;而IoFilterChain是Mina框架运行服务所需用的,即是有一兩个 运行时辅助管理IoFilter链调用的工具。

从IoAcceptor接口定义,都不可以 很好地看出它具有的有些基本操作,如下所示:

大伙儿都不可以 就看,IoService主要定义了两类服务,一类是提供I/O操作相关服务,另一类是会话 (IoSession)相关服务,这两类服务,无论是在服务端还是在客户端,都不 提供,以此来保证双方通信。没有 ,具体地这两类服务中都包括哪此内容,大伙儿总结如下:

每个IoService都对应这有一兩个 Executor,用来正确处理被触发的I/O事件。

IoAcceptor和IoConnector以前区分I/O操作相关的不同服务了,作为通信的服务器端和客户端,必然占据 有些差异服务来维持人个 所有在通信过程中的角色,比如,IoAcceptor需用监听指定服务端口,等待的图片 客户端的连接到服务器端,而IoConnector与服务器端进行通信,首先应该连接到服务器端Socket暴露的服务地址。下面,大伙儿分别根据通信双方的这这一不同角色,来深入讨论有些细节。

与有一兩个 IoSession有关的数据,都不 里面的特性中保存着。其中主要含有两类:一类是用户在启动会话时定义的属性集合,另一类是会话期 间以前需用进行读写操作。每个IoSession实例调用write方式的以前,都不 对应这有一兩个 WriteRequest对象,封装了写请求数据。而提供I/O服务的IoService实例在运行都不 把对应的WriteRequest对象倒入/移出IoSessionDataStructureFactory 特性所持有的队列。

每当有有一兩个 新的会话被创建,及使用了IoService提供的服务,就对应创建了有一兩个 IoSession实例,否则 ,与IoSession 相关的有些实时数据需用在内存中保存,以便IoService实例不不可以随时访问并对该会话实例提供需用的I/O读写服务。Mina定义了 IoSessionDataStructureFactory,来保存会话相关数据,这一特性提供了如下有一兩个 方式:

IoConnector的接口定义,如下所示:

有一兩个 IoServiceListener定义如下操作:

里面类图中,AbstractIoService实现了IoService接口中定义的操作,并肩增加了有些属性字段,都不可以 通过哪此字段看出,Mina框架IoService抽象服务层设计了哪此数据特性,用来辅助有关I/O操作的服务。大伙儿通过如下几只方面来详述:

IoService抽象

根据上图中IoService接口定义,大伙儿给出接口中定义的方式,如下所示:

IoConnector定义的操作基本是与连接到服务端的。同样,AbstractIoConnector实现了Connector接口定义的基本操作。以基于TCP的NIO通信为例,客户端和服务端有偏离 操作非常相似,如轮询SocketChannel检查是是否事件触发,读写请求等,好多好多 ,客户端在AbstractIoConnector的抽象实现类AbstractPollingIoConnector中正确处理于此相关的逻辑。与NioSocketAcceptor对应,客户端有有一兩个 NioSocketConnector实现类。

都不可以 就看里面定义的方式中,主假使 与IP地址相关的操作,主要包括绑定和解绑定,哪此操作的实现是在该接口的抽象实现类AbstractIoAcceptor中给予实现的,在AbstractIoAcceptor中并没有 涉及到有关SocketChannel的I/O操作,有关怎样基于轮询的策略去检查SocketChannel是是否相应的事件被触发,哪此I/O相关的操作被封装下 AbstractPollingIoAcceptor类中。以基于TCP的NIO通信为例,具体接收客户端到来的连接请求,哪此逻辑是在AbstractPollingIoAcceptor的实现类NioSocketAcceptor中实现的,这里创建了用来管理与客户端通信的NioSocketSession对象(它是IoSession的NIO实现)。

其中Entry包装了有一兩个 IoFilter以及为其定义的名称。从IoFilterChainBuilder的名称来看,它假使 关注有一兩个 IoFilterChain怎样创建,而不关心一组注册的IoFilter调用顺序,假使 关心被指定事件被触发时调用哪个操作,哪此逻辑是由 IoFilterChain来定义,并通过实现这一接口的DefaultIoFilterChain类实现的。当大伙儿调用DefaultIoFilterChainBuilder 实例的有关操作IoFilter的方式,如下所示(在DefaultIoFilterChainBuilder中实现):

通过接口中定义的方式名,都不可以 了解到,有一兩个 IoService监听器都负责监听哪此事件。

实际上,支持I/O操作服务的内容,集中在有一兩个 类中:IoService和AbstractIoService,看一下类图:

当大伙儿创建有一兩个 IoService实例时,以前是服务器端的IoAccectpr,也以前是客户端的IoConnector,都不可以 分别通过调用如下有一兩个 方式来增加以前移除有一兩个 IoServiceListener:

管理服务于IoService的IoServiceListener,主假使 通过IoServiceListenerSupport类,这 个类中定义了如下特性:

IoAcceptor与IoConnector抽象

就像里面IoServiceListener与IoServiceListenerSupport的关系一样,IoFilter是通过另一 个工具类IoFilterChainBuilder来聚合起来,形成有一兩个 IoFilter链。通过实现IoFilterChainBuilder 接口的DefaultIoFilterChainBuilder都不可以 对一组IoFilter进行创建。含有的数据特性如下所示:

最终使用的Acceptor和Connector是里面继承层次中最下层的实现类。

通过里面IoAcceptor和IoConnector的说明,大伙儿还不知道具体I/O操作是由谁来正确处理的。实际上,无论是服务端还是客户端,在正确处理轮询通道的抽象服务中,封装了有一兩个 IoProcessor抽象,它才是实际正确处理I/O操作的抽象偏离 。为了将通信的宏观抽象过程与通信过程中的正确处理细节分开,将IoProcessor独立出来,与宏观通信过程的逻辑解耦合。以基于TCP的NIO通信为例,在AbstractPollingIoAcceptor和AbstractPollingIoConnector中都不 有一兩个 IoProcessor实例(这里是实现类NioProcessor的实例),通过调用它提供的正确处理操作来完成实际的I/O操作。