从上一篇文章中知道,IoService出于MINA体系中的底层。IoService将会帮你维护网络交互,接受消息,发送消息,管理Sessions,管理连接Connections等等。
IoService 是一个接口,服务端的IoAcceptor和客户端的IoConnector均继承了该接口。下面我们将分为以下几个部分介绍IoService
1. IoService Introduction
2. IoService Details
3. IoAcceptor
4. IoConnector
IoService Introduction
IoService在MINA中提供了基本的I/O 服务并且管理I/O 会话。它是在MINA体系中最重要的模块之一,Ioservice的实现及子接口,大部分操作的是底层的I/O操作。
如上图,IoService有很多的职能:
1. sessions的管理: 创建和删除sessions, 检查session的空闲状态
2. 过滤连的管理: 管理过滤连,允许用户改变filter chain
3. 回调:当有消息抵达时调用IOHandler
4. 统计管理:统计更新消息的发送次数
5. 监听管理:Manages the Listeners a suer can set up
6. 传输管理: 处理服务端和客户端之间数据的传输
IoService接口提供了以下方法:
1. getTransportMetaData()--该方法返回IoAcceptor,IoConnector在运行时的元数据,包括运营商名称,连接的类型等
2. addListener()--该方法为IoService添加一个IoServiceListener来侦听指定的事件
3. removeListener()--该方法从IoService中移除指定的IoServiceListener
4. isDisposing()--该方法返回IoService是否正在停止
5. isDisposed()--该方法返回IoService是否已经停止
6. dispose()--该方法用于释放IoService分配的所有资源
7. getHandler()--获取该IoService所分配的IoHandler
8. setHandler()--返回分配给该IoService的IoHandler
9. getManagedSessions()--返回当前被IoService管理的所有Session的Map集合
10. getManagedSessionCount()--返回当前被IoService管理的所有Session的大小
11. getSessionConfig()--获取session的配置类
12. getFilterChainBuilder()--返回FilterChain Builder,用于向已创建的session中加入新的Filter
13. setFilterChainBuilder()--为IoService定义一个Filter Chain Builder
14. getFilterChain()--获取当前的Filter Chain
15. isActive()--返回IoService是否处于活动状态
16. getActivationTime()--返回IoServcie被激活的时间
17. broadcast()--将消息发送给所有被管理的Sessions
18. setSessionDataStructureFactory()--
19. getScheduledWriteBytes()--返回将要被发送的字节数
20. getScheduledWriteMessages()--返回将要被发送的消息数
21. getStatistics()--为IoService返回IoServiceStatistics对象
IoService Details
IoService被两个最重要的接口实现,分别是IoAcceptor, IoConnector。为了创建一个Server,需要实现IoAcceptor接口,为了创建一个Clinent,需要实现IoConnector接
口。
IoAcceptor
该接口的命名由来是因其方法accept(),负责创建client和server之间的connection,服务端server接受connection请求。另外,我们可能命名这个接口为“Server”(在即将
到来的MINA3.0中)。
实现该接口的类有:
1. NioSocketAcceptor:无阻塞(non-blocking)面向socket连接的IoAcceptor
2. NIoDatagramAcceptor: 无阻塞(non-blocking) 面向udp连接的IoAcceptor
3. AprSocketAcceptor:阻塞(blocking)socket连接的IoAcceptor,基于APR
4. VmPipeSocketAcceptor:in-VM IoAcceptor
下图展示IoAcceptor继承关系图
1. creation:创建
选择一个IoAcceptor类型,选择的依据是基于选择通讯的协议
public TcpServer() throws IOException {
// Create a TCP acceptor
IoAcceptor acceptor = new NioSocketAcceptor();
// Associate the acceptor to an IoHandler instance (your application)
acceptor.setHandler(this);
// Bind : this will start the server...
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("Server started...");
}
2. disposal : 关闭
IoAcceptor可通过调用dispose()来停止,该服务将会在当所有的sessions都被处理后停止。
// Stop the service, waiting for the pending sessions to be inactive
acceptor.dispose();
同样你也可以通过传送一个参数true给dispose来实现等待所有线程正确执行完成后停止该service。
// Stop the service, waiting for the processing session to be properly completed
acceptor.dispose( true );
3. status:状态
你可通过调用一下方法获取IoAcceptor(IoService)的状态
1. isActive() - 当IoService能接收请求时返回true
2. isDisposing() - 如果dispose()方法被调用则返回true, 但并不表示IoService已经停止了(有可能有些sessions还在被处理)
3. isDisposed() - 如果dispose(true)方法被调用并且执行的线程已经完成时则返回true
4. 管理IoHandler
当一个IoService(IoAcceptor)被实例化后,可增加或获取IoHandler。调用方法:setHandler(IoHandler) 或 getHandler()
5. 管理Filter Chain
如果想管理过滤器链,可通过调用方法getFilterChain():
// Add a logger filter
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
chain.addLast("logger", new LoggingFilter());
如果想在将Filter Chain 在将它设置给IoService之前创建,可以通过以下方法实现:
// Add a logger filter
DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
chain.addLast("logger", new LoggingFilter());
// And inject the created chain builder in the service
acceptor.setFilterChainBuilder(chain);
IoConnector
和我们必须实现IoAcceptor接口实现服务器一样,必须用IoConnector接口实现客户端。
实现该接口的类如下:
1. NioSocketConnector:无阻塞(no-blocking)面向socket连接的IoConnector
2. NIoDatagramConnector:无阻塞(no-blocking)面向Udp连接的IoConnector
3. AprSocketConnector:阻塞(blockiing)面向socket连接的IoConnector, 基于APR
4. ProxyConnector:支持代理的IoConnector
5. SerialConnector:支持串行传输的IoConnector
6. VmPipeConnector:in-VM IoConnector
下图为IoConnector 继承关系图
以上就是IoService部分内容,下一篇讲述IoSession。