第四章 会话
会话是MINA的核心:每次一个客户端连接到服务器,一个新的会话将被创建,而且该会话在客户端连接关闭前将一直驻留在内存中。
在一个会话的整个生命周期中,它被用于存储连接的持久化信息,以及服务器在处理请求过程中所需要的其他附加信息。
4.1 会话状态
每个会话都有一个状态,而且这个状态在随着时间不断变化:
(1)已连接:会话已经被创建并且是可用的
(2)空闲:会话至少已经有一个时间周期没有处理过请求了(这个周期的时间是可配置的)。
a)读空闲:一个周期内没有实际的读操作
b)写空闲:一个周期内没有实际的写操作
c)双空闲:一个周期内没有读、写操作
(3)正在关闭:会话正在关闭(剩余的消息正在刷新,清理工作还未结束)
(4)已关闭:会话已关闭。无法再次激活它。
下图是会话所有可能的状态转换:
<!--[endif]-->
4.2配置
可以通过设置不同的参数来获取一个定制的会话:
(1)接收缓冲区大小
(3)空闲时间
(4)写超时时间
还有另外一些配置是依赖于所使用的传输协议的(具体参考第六章)。
4.3管理用户定义的属性
为了存储一些以后会用到的数据,自定义一些属性是必须的。可以通过为每个会话所关联专用的数据结构来实现的。这是一个key-value的键值对,可以存储开发者可能想保存的任何数据类型。
举例来说,如果你想追踪在会话建立以后一个用户发送的请求总数,可以简单地通过创建一个key来关联请求总数并将其保存到这个map即可。代码如下:
int counterValue = session.getAttribute("counter");
session.setAttribute("counter", counterValue +1);
我们有一个方案来处理存储在会话中的属性:每个属性是一个键值对的一个组成部分,可以在会话的容器中添加、删除和读取。
这个容器在会话被创建时自动创建,在会话终止时销毁。
4.4自定义容器
就像我们说的,这个容器是一个键值对,缺省的实现是一个Map。但有些时候,我们可能需要定义其他的数据结构来存储需要长期存活的数据或者是避免在内存中存储超大数据,可以通过实现一个接口和一个用于在会话创建时创建容器的工厂。
一些代码片段展示了如何在会话初始化时创建容器:
protectedfinalvoidinitSession(IoSession session,
IoFuture future, IoSessionInitializer sessionInitializer){
...
try{
((AbstractIoSession) session).setAttributeMap(session.getService()
.getSessionDataStructureFactory().getAttributeMap(session));
}catch(IoSessionInitializationException e){
throw e;
}catch(Exception e){
thrownewIoSessionInitializationException(
"Failed to initialize an attributeMap.", e);
}
接下来的代码展示了如果我们想要定义一个其他类型容器所需要实现的接口。
public interface IoSessionDataStructureFactory {
/**
* Returns an {@link IoSessionAttributeMap} which is going to be associated
* with the specified <tt>session</tt>. Please note that the returned
* implementation must be thread-safe.
*/
IoSessionAttributeMap getAttributeMap(IoSession session) throws Exception;
}
4.5过滤器链
每个会话都关联一个过滤器链,用于处理接收到的请求或发出的信息。这些过滤器是可以独立于每一个会话的,但大多数情况请,我们对所有现存的会话使用非常相似的过滤器。
当然,我们也可能为了一个会话而动态修改过滤器,例如为一个特别的会话添加一个日志过滤器。
4.6 统计
每一个会话都保留着一份记录,记录这个会话干了些啥:
(1)发送和接收的字节总数
(2)发送和接收的消息总数
(3)空闲状态
(4)吞吐量
和许多其他有用的信息。
4.7 处理器
最后,很重要的一点,一个会话通过其关联的处理器来调度你应用中的消息。这个处理器也通过简单地调用会话的write()方法来来发送回复。
...
session.write(<your message>);
...
相关推荐
Apache Mina是一个基于Java的网络通信框架,专为高性能、高可用性和可扩展性而设计。...在深入学习Mina的过程中,理解IoService及其子类的工作原理,以及如何结合IoHandler实现业务逻辑,对于掌握Mina框架至关重要。
Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)
1. **下载使用的Jar包**:在开始Mina2.0的学习之前,你需要从Apache官网或其他可靠的源下载Mina的最新版本库。通常,这包括核心库和其他依赖库,如slf4j用于日志记录。 2. **工程创建配置**:创建一个新的Java项目...
在MINA的学习笔记中,记录的所有API通常会包括以下几个核心部分: 1. **IoSession**: 这是MINA的核心接口,代表了客户端和服务器之间的连接。IoSession提供了读写数据、管理连接状态、获取会话属性等功能。例如,`...
Apache Mina是一个高性能、事件驱动的网络应用框架,主要用于简化开发服务器端的复杂性,尤其在处理TCP/IP、UDP和SSL/TLS等协议时。它提供了丰富的API和工具,使得开发者能够快速构建网络应用程序,如FTP、SMTP、...
在本学习笔记中,我们将专注于MINA的子项目——FtpServer,它是实现FTP服务器功能的一个模块。 FTP(File Transfer Protocol)是一种广泛使用的互联网协议,用于在不同主机之间传输文件。Apache MINA FtpServer提供...
**Mina 学习笔记(入门)** Apache Mina 是一个高度可扩展的网络通信框架,主要用于构建高性能、高效率的服务器端应用。它提供了一种简单的方式来处理网络协议,如TCP/IP和UDP/IP,以及SSL/TLS加密的连接。在本学习...
Apache Mina是一个强大的开源框架,专门用于构建高性能、高可扩展性的网络应用程序。Mina2.0是其一个重要的版本,提供了许多改进和新特性,使得开发者能够更轻松地处理网络通信任务,尤其是在Java NIO(Non-blocking...
在这个"Apache MINA2学习笔记DEMO"中,我们很可能会看到如何使用MINA来创建一个自定义协议的示例。自定义协议通常是为了满足特定应用的需求,例如高效的数据传输、安全性或者特定的编码格式。MINA允许开发者定义自己...
《mina学习笔记》 Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,主要设计用于简化网络应用程序的开发,尤其是TCP和UDP协议的应用。MINA 提供了一种与网络协议无关的API,...
第三步.服务端程序 3 第四步.客户端程序 6 第五步.长连接VS短连接 8 二. Mina基础 9 1.IoService接口 10 2.1.1 类结构 11 2.1.2 应用 12 2.IoFilter接口 14 2.2.1 类结构 14 2.2.2 应用 16 添加过滤器 16 自定义编...
### MINA学习笔记 #### MINA概述 MINA是一个用Java编写的高性能、轻量级的网络通信框架,主要用于简化网络编程的复杂性。它支持多种传输协议(如TCP/IP和UDP/IP),并且提供了一套丰富的API来处理网络通信相关的...
MINA 是一个网络应用框架,有助于用户非常方便地开发高性能、高伸缩性的网络应用。 此文档80多页,是方便Mina上手的文档。