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. JS 页面加载触发事件 document.ready和onload的区别(转)

    原博地址:http://blog.163.com/zhaoyanping_1125/blog/static/20132915320111129113723710/ * document.ready和o ...

  2. 本博客css style

    #navList { min-height: 60px; } #navList li { height: 60px; } #navList a { margin: 0px 5px !important ...

  3. Mvc 分页栏扩展方法

    using System; using System.Collections.Generic; using System.Reflection; using System.Text; using Sy ...

  4. JavaNIO之Channel

    Channel的本质是通道,用来连接JVM之外数据向JVM内传输数据,比如来自于硬盘的文件,来自于网络的数据包.JVM之外的数据就是通过Channel进行数据传输:如果把Channel比作河道,那么作 ...

  5. 文档学习 - UILabel - 属性详解

    #import "ViewController.h" @implementation ViewController - (void)viewDidLoad { [super vie ...

  6. C++返回引用的函数

    要以引用返回函数值,则函数定义时的格式如下: 类型标识符&类型名 (形参列表及类型说明) { 函数体 } 用const限定引用的声明方式为: const 类型标识符&引用名=目标变量名 ...

  7. django入门教程(上)

    相信用过python的人都听过Django的大名,知道它是一个web框架,用来支持动态网站.网络应用程序以及网络服务的开发.那么为什么我们需要一个web框架,而不是直接用python来写web应用呢? ...

  8. cocos2dx 环境搭建 win7 +vs2012+ cocos2dx-2.1.4

    转自:http://my.eoe.cn/swer03160828/archive/20067.html 1) 如果在win32 下面编写的cocos2dx 的代码其文件 .cpp,.h 的文件,基本上 ...

  9. 在html中嵌入markdown

    在博客园网页里写markdown的时候, 某些特殊内容想加上自定义的css, 于是用<div class="xxx">包裹起来, 但是发现该<div>中的m ...

  10. Earth to developers: Grow up!

    这是篇老外写的文章,主题是针对网络上的一些宗教式的争论,作者叙述了他自己的一些观点.主要从以下6点做了陈述.为了表达的精确性,就直接用英文. 1. Reject dogmatic thinking a ...