Session(会话)是Mina的核心部分:每当一个clinent连接到server时,都会创建一个新的session,并且保存在内存中知道该链接断开。

session 是用来存储一些关于连接信息,加上各种服务端在处理请求时可能会用到的信息。

Session state

session有一个状态,并且会随着时间变化。

1. Connected:session已经被创建并且是可用的
2. Idle:session 在一段时间(可配置)能没有处理任何请求。

   A:Idle for read:在一段时间内没有任何读发生  
   
   B:Idle for write:在一段时间内没有任何写发生  

   C:Idle for both:在一段时间内没有任何读写发生

3. Closing:session出于关闭过程中

4. Closed:session已关闭,不能再使用

下图为session的状态图

Configuration

我们可以为一个session设置很多参数

1. receive buffer size:接受缓冲区的大小

2. sending buffer size:发送缓冲区的大小

3. Idle time:空闲确认时间

4. 写数据超时时间

加上一些其他的设置,依赖于通讯类型。

Managing user-defined attributes

session中可以已键值对(key - value)的方式存放数据,然后再后续过程中使用。例如你想跟踪一个session自从被创建后已经发送了多少个请求,通过将笔数计入到session

中就可以很容易的实现该功能。

int counterValue = session.getAttribute( "counter" );
session.setAttribute( "counter", counterValue + 1 );

Defining the container

上面讲到了session中存放数据,是用了session中默认的container是使用map结构,但是我们依然可以自定义另一种数据结构来存放数据,这可以解决如果我们想避免存储那

些很大的数据在内内存中。可通过实现一个factory接口,该接口在session创建中将会被用于创建容器(container)。

以下代码展示了在session初始化过程中如何创建container的

protected final void initSession(IoSession session,
IoFuture future, IoSessionInitializer sessionInitializer) {
...
try {
((AbstractIoSession) session).setAttributeMap(session.getService()
.getSessionDataStructureFactory().getAttributeMap(session));
} catch (IoSessionInitializationException e) {
throw e;
} catch (Exception e) {
throw new IoSessionInitializationException(
"Failed to initialize an attributeMap.", e);
}
..

以下代码则展示了如果我们想要自定义container则需要实现的工厂类接口:

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;
}

Filter Charin

每一个session都会关联一个filters chain,这些filter对每一个session之间都是独立的,即使在所有的session中使用相同的filter chain.

然而,我们也可以为某一个session添加一个filter。例如为某一指定的session添加一个Logger Filtter。

Statistics

每一个Session也可记录下在这个session中所有的操作:

1.  接受或发送的字节数

2.  接受或发送的消息数

3. 空闲状态

4. 吞吐量

和一些其他有用的信息

Handler

最后,尤为重要的是,每个session都会附加上一个IoHandler,负责发送消息给应用程序,并且通过session发送应答包,调用方法write()。

session.write( <your message> );

至此,已将IoSession介绍完了,下篇将介绍IoFilter。


Mina学习之IoSession的更多相关文章

  1. 【MINA学习笔记】—— 1.体系结构分析[z]

    前言 Apache的MINA框架是一个早年非常流行的NIO框架,它出自于Netty之父Trustin Lee大神之手.虽然目前市场份额已经逐渐被Netty取代了,但是其作为NIO初学者入门学习框架是非 ...

  2. MINA学习汇总

    MINA学习汇总 Apache Mina Server 是一个网络通信应用框架,用于开发高性能和高可用性的网络应用程序.它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(然,也可以提供JAVA ...

  3. Mina学习之---mina整体流程介绍

    现在公司使用的NIO框架一直时候Mina,当然这也的框架还有Netty.虽然一直在用,但只是简单的停留在业务层面,最近面试的时候有问Mina相关的东西.在之前的博客中已经对BIO,NIO,AIO这三种 ...

  4. NIO框架Mina学习

    前言: 找了篇文章看了看,nio框架数Mina用的最多! 代码: 服务端: package com.mina; import java.net.InetSocketAddress; import ja ...

  5. mina学习

    长连接表示一旦建立了链接,就可以长时间的保持双方的通讯,例如: socket链接,推送平台. 短链接表示建立链接,完成数据的交换之后,就断开链接,例如: http链接. mina 框架是对socket ...

  6. MINA学习之体系介绍

    基于MINA应用程序结构图: 我们可以看出,MINA是应用程序(客户端或服务端)和底层基于TCP,UDP等通讯协议的网络层之间的粘合剂.而且各个模块之间是相互独立的,你只需要在MINA体 系基础上设计 ...

  7. Mina学习+手写服务端+通过telnet连接服务端

    1. 2. 3. 4.MinaServer.java package com.mina; import java.io.IOException;import java.net.InetSocketAd ...

  8. mina学习(一)

    Mina:是一个帮助用户开发高性能和高伸缩性网络应用程序的框架 学习地址链接:http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html ...

  9. Mina学习之IoFilter

    IoFilter 是MINA中的一个核心结构,扮演了非常重要的角色.IoFilter在IoService和IoHandler过滤了所有的I/O 事件和请求.如果你有做个web项目的经验,则很类似于we ...

随机推荐

  1. C++顺序容器类总结

    主要是vector,deque,list,forward_list,array,string 插入方法: 元素访问: 元素删除: 容器赋值: forward_list有很多特殊的方法 毕竟平时forw ...

  2. 使用ajax和history.pushState无刷新改变页面URL onpopstate(转)

    Javascript代码 var htmlData1 = $.ajax(    {    url: "/getXXXResponse",    async: false }).re ...

  3. Axure草记

    页面控件和DataSet绑定,DataSet和输入控件绑定(通过临时变量) 双击Repeater进入之后,你会发现下面已经默认添加了3行,这代表着,每增加一行将会重复3遍: Repeater可以只是部 ...

  4. PHP程序的一次重构记录

    项目和新需求: 我们有一个PHP写的webmail系统,有一个mail_list.php用于展现用户的邮件列表这个页面支持folderId参数(因为邮件是存在不同的文件夹下的)由于邮件太多所以支持翻页 ...

  5. 修改 Analysis Service 服务器模式

    原网址:http://cathydumas.com/2012/04/23/changing-an-analysis-services-instance-to-tabular-mode/ Say you ...

  6. Java 声明和访问控制(一) 数组的声明 private可以修饰类吗

    数组的声明: int []a[] = new int[4][];//是正确的 int[] array = new int[2]{1,2};//是错误的 数组的长度是不可改变的,不能通过任何方式改变大小 ...

  7. php拓展ssh功能

    1.下载拓展ssh需要的两个软件包,libssh2和ssh2. libssh2下载地址:http://pan.baidu.com/s/1hq7XOhu libssh2官网下载地址:http://www ...

  8. 蓝牙RSSI计算距离

    利用CoreLocation.framework很容易扫描获得周边蓝牙设备,苹果开源代码AirLocate有具体实现,下载地址: https://developer.apple.com/library ...

  9. android Button 颜色的变化(点击,放开,点击不放)

    参考: http://endual.iteye.com/blog/1534258 总结: 定义res/drawable/button_style.xml文件 <?xml version=&quo ...

  10. m2e使用问题——发布web项目时lib目录下的jar包未发布

    解决过程如下: 在项目上点右键查看properties—>Deployment Assembly,看Deploy Path这项上是否缺少WEB-INF/lib这一项. 相关操作截图如下: