服务 / IoService

Mina.NET中的IoService负责服务端与客户端所有的IO服务,包括与远端连接交互、发送和接收消息、会话管理等等。

IoService有两个重要的子接口:用于服务端的IoAcceptor,和用于客户端的IoConnector
创建服务端时,需要选择IoAcceptor接口的一个实现类;创建客户端时,则需要选择IoConnector接口的一个实现类。

IoService 介绍

IoService 负责提供基础 I/O 服务和管理 I/O 会话,它是Mina.NET架构中最关键的部分。它的子接口和子类负责处理大部分底层 I/O 操作。

职责

  • 会话管理:创建、移除会话,检测空闲会话
  • 过滤器链管理:维护过滤器链,并允许用户动态改变过滤器链
  • 调用IoHandler:当事件发生时,调用IoHandler
  • 数据统计:统计接收与发送的消息数量、字节数量等
  • 生存周期事件:服务启动/空闲/停止,会话事件等
  • 通讯管理:接收或发送数据

接口描述

IoService是所有IoConnectorIoAcceptor的基接口,它们提供了 I/O 服务并管理着 I/O 会话。这些接口包含了所有 I/O 相关操作需要的方法。

属性

方法

事件

ActivationTime

获取服务启动的时间。如果服务已经停止,则返回服务上一次运行的时间。

Active

获取服务当前是否在运行中。

Disposed

获取服务是否已经释放。

FilterChainBuilder

获取或设置IoFilterChainBuilder,用于在会话创建时为其生成过滤器链。

FilterChain

获取当前的默认DefaultIoFilterChainBuilder

Handler

获取或设置用于处理会话事件的IoHandler

ManagedSessions

获取服务中当前管理的所有会话,这是一个会话ID-会话的字典。

SessionConfig

获取当前的会话配置。

SessionDataStructureFactory

获取或设置用于为新会话提供相关数据结构的IoSessionDataStructureFactory

Statistics

获取统计信息IoServiceStatistics

TransportMetadata

获取服务的传输元数据,包含服务提供程序名称(mina, async)、连接类型(无连接、面向连接)等。

Broadcast(Object)

向所有会话广播消息。

Dispose()

释放服务及其占用的所有资源。

Activated

服务启动事件。

Idle

服务空闲事件。

Deactivated

服务停止事件。

SessionCreated

会话创建事件。

SessionDestroyed

会话销毁事件。

SessionOpened

会话打开事件。仅当未设置Handler属性时有效,否则请使用IoHandler.SessionOpened(IoSession)

SessionClosed

会话关闭事件。仅当未设置Handler属性时有效,否则请使用IoHandler.SessionClosed(IoSession)

SessionIdle

会话空闲事件。仅当未设置Handler属性时有效,否则请使用IoHandler.SessionIdle(IoSession, IdleStatus)

ExceptionCaught

会话异常事件。仅当未设置Handler属性时有效,否则请使用IoHandler.ExceptionCaught(IoSession, Exception)

MessageReceived

会话消息接收事件。仅当未设置Handler属性时有效,否则请使用IoHandler.MessageReceived(IoSession, Object)

MessageSent

会话消息发送事件。仅当未设置Handler属性时有效,否则请使用IoHandler.MessageSent(IoSession, Object)

需要注意的是,当设置了Handler属性时,以上6个事件(SessionOpened、SessionClosed、SessionIdle、ExceptionCaught、MessageReceived和MessageSent)不会被触发,因此,不能同时使用IoHandler和以上这些事件。

IoAcceptor

这个接口被命名为IoAcceptor是因为套接字中有一个Accept()方法,用于接受客户端连接。Mina.NET有几种IoAcceptor实现,用于不同的传输通道(TCP/UDP/...):
  • AsyncSocketAcceptor: 异步TCP服务端
  • AsyncDatagramAcceptor: 异步UDP服务端
  • LoopbackAcceptor: 回环管道(应用程序内部管道)服务端

下图是IoAcceptor接口及其子类的类图:


创建

首先需要选择一种传输类型,例如:

public TcpServer()
{
  IoAcceptor acceptor = new AsyncSocketAcceptor();

  acceptor.Bind(new IPEndPoint(IPAddress.Any, port));

  Console.WriteLine("Listening on " + acceptor.LocalEndPoint);
}

以上示例代码中创建了一个TCP服务端。如果需要创建UDP服务端,只需要将第一行代码替换为如下代码即可:

...
IoAcceptor acceptor = new AsyncDatagramAcceptor();
...

解除绑定

调用Unbind()方法可以停止服务端。

acceptor.Unbind();

释放资源

调用Dispose()方法可以停止服务端并释放资源。

acceptor.Dispose();

管理过滤器链

使用FilterChain属性可以管理过滤器链,例如:

acceptor.FilterChain.AddLast("logger", new LoggingFilter());

也可以先创建过滤器链,再将其设置给服务。

DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
chain .AddLast("logger", new LoggingFilter());

acceptor.FilterChainBuilder = chain;

IoConnector

IoAcceptor相对的是用于客户端的IoConnector,同样,Mina.NET有几种IoConnector实现,用于不同的传输通道(TCP/UDP/...):
  • AsyncSocketConnector: 异步TCP客户端
  • AsyncDatagramConnector: 异步UDP客户端
  • SerialConnector: 用于串口的客户端
  • LoopbackConnector: 回环管道(应用程序内部管道)客户端

下图是IoConnector接口及其子类的类图:

Last edited Apr 15, 2014 at 3:36 AM by longshine, version 4