会话 / IoSession

当客户端连接到服务端时,一个会话(IoSession)将被创建,一直保持到连接断开。会话保存着连接的基本信息,以及处理请求时可能需要保存的其他信息。

会话状态

会话的状态将随着时间而变化:
  • 连接 / Connected:会话已连接,当前可用
  • 空闲 / Idle:会话在一段时间内没有处理任何请求(空闲时间可配置)
    • 接收空闲:一段时间内没有接收到任何数据
    • 发送空闲:一段时间内没有发送任何数据
    • 同时空闲:一段时间内没有接收或发送任何数据
  • 关闭中 / Closing:会话正在关闭
  • 已关闭 / Closed:会话已关闭,当前不可用

下图描述了所有可能的会话状态及状态转换:



(图片来自 Apache MINA)

配置

会话拥有一些可以配置的参数:
  • 接收缓冲区大小
  • 空闲时间
  • 发送超时时间
  • 传输通道相关的其他配置(参阅 传输通道)

管理自定义属性

有时可能需要存储一些与会话相关的数据,每个会话中都关联有一个键-值对的数据结构,可以满足这种需求,能够存储任何类型的数据。例如,如果想记录会话创建后接收到的请求数量,只需要在会话属性中创建一个保存请求数量值的记录:

...
int counterValue = session.GetAttribute<Int32>("counter");
session.SetAttribute("counter", counterValue + 1);
...

我们可以将这种键-值对形式的属性存储在会话的属性容器中,会话提供了一些方法来添加、读取或移除这些属性。会话的属性容器会在会话创建时自动创建,同样,在会话结束时也将自动销毁。

定义会话容器

默认情况下,会话窗口是一个字典Dictionary。如果有特殊需求,也可以通过实现IoSessionAttributeMap接口和IoSessionDataStructureFactory工厂接口来实现自定义数据结构。以下代码展示了会话初始化时是如何创建属性容器的:

protected void InitSession<TFuture>(IoSession session, TFuture future, Action<IoSession, TFuture> initializeSession) where TFuture : IoFuture
{
...
  AbstractIoSession s = session as AbstractIoSession;
  s.AttributeMap = s.Service.SessionDataStructureFactory.GetAttributeMap(session);
...
}

下面这个工厂接口用于创建属性容器,如果需要定义其他容器,需要实现这个接口:

public interface IoSessionDataStructureFactory
{
  IoSessionAttributeMap GetAttributeMap(IoSession session);
}

过滤器链

每个会话拥有独立的过滤器链,用于处理这个会话接收和发送的消息。一般情况下,会话将继承IoService中定义的过滤器链,因此,所有会话的过滤器链将拥有同样的内容,不过,由于会话的过滤器链是独立的,因此可以动态的修改每个会话的过滤器链,例如为某个会话添加日志过滤器。

统计信息

每个会话保存着一些统计信息:
  • 发送/接收字节数量
  • 发送/接收消息数量
  • I/O 时间
  • 空闲时间
  • 吞吐量

发送数据

简单地调用Write()即可向会话发送数据:

...
session.Write( <your message> );
...

Last edited Apr 14, 2014 at 8:14 AM by longshine, version 1