Mina基础(四):理解IoSession、I/O Processor、IoBuffer
Session会话
Session会话处于 MINA 的核心位置:每当一个客户端连接到服务器,一个新的会话会被创建,并会在客户端关掉连接前一直保存在内存中。会话用于保存连接的持久信息,以及在请求处理过程中、会话的生命周期中服务器可能需要用到的任何信息。
IoSession:主要描述我们的网络通信双方所建立的连接之间的描述。
作用:可以完成一些对于连接的管理,比如发送或者读取数据、设置会话的上下文信息等。
IoSessionConfig:提供我们对连接的配置信息的描述,不如读缓冲区的设置等等。
作用:设置读写缓冲区的一些信息,读写的空闲时间,以及设置读写超时时间。
相关参考API:
http://tool.oschina.net/apidocs/apidoc?api=mina
IoSession常用方法:
IoSessionConfig常用方法:
会话会有一个随着时间演变的状态:
- 已连接:会话已被创建并可用
- 闲置:会话在至少一段时间 (这段时间是可配的) 内没有处理任何请求
- 读闲置:在一段时间内没有任何读操作
- 写闲置:在一段时间内没有任何写操作
- 同时闲置:在一段时间内既没有读操作也没有写操作
- 关闭中:会话正在关闭中 (还有正在清空的消息,清理尚未结束)
- 已关闭:会话现在已被关闭,没有其他方法可以将其恢复。
以下状态图揭示了所有可能的状态及其转换:
IoSessionConfig配置(具体配置,见后面的搭建)
对于特定会话可以设置以下不同的参数:
- 接收缓冲大小
- 发送缓冲大小
- 空闲时间
- 写超时时间
另外还有一些其他配置,取决于你所用的传输类型 (参考《Apache MINA 2.0 用户指南》第六章:传输)。
I/O Processor
Processor:以NIO为基础实现的以多线程的方式来完成我们读写工作。
作用:为我们的filter读写原始数据的多线程环境,如果Mina不去实现的话,则需要我们自己来实现一个非阻塞读写的多线程环境。
配置Processor多线程环境
1、 NioSocketAcceptor(int processorCount) :指定服务端的多线程环境个数
2、 NioSocketConnector(int processorCount) :指定客户端的多线程环境个数
实现方式分析需要查看源码。
待续。
IoBuffer
基于java的NIO中的ByteBuffer做了封装,用于操作缓冲区中的数据,包括基本数据类型以及字节数组和一些对象,其本质就是一个可动态扩展的byte数组。
IoBuffer索引说明:
Capacity:代表当前缓冲区的大小。
Position:理解为当前读写位置,也可以理解为下一个可读数据单位的位置,当Position <= Capacity的时候可以完成数据的读写操作。
Limit:下一个不可用被读写缓冲区单元的位置,Limit <=Capacity。
IoBuffer常用API
- static IoBuffer allocate(int capacity, boolean useDirectBuffer)
创建IoBuffer实例,第一个参数指定初始化容量,第二个参数指定使用直接缓冲区还是JAVA 内存堆的缓存区,默认为false。
- IoBuffer setAutoExpand(boolean autoExpand)
这个方法设置IoBuffer 为自动扩展容量,也就是前面所说的长度可变,那么可以看出长度可变这个特性默认是不开启的。
- IoBuffer flip()
limit=position ,position=0,重置mask,为了读取做好准备,一般是结束buf操作,将缓冲流buf中数据写入输出流时调用;这个必须要调用,否则极有可能position!=limit,导致position后面没有数据;每次写入数据到输出流时,必须确保position=limit。
- IoBuffer clear() 与 IoBuffer reset()
clear():令limit=capacity ,position=0,重置mark;它是不清空数据,但从头开始存放数据做准备---相当于覆盖老数据。reset():清空数据
- int remaining() 与 boolean hasRemaining()
这两个方法一般是在调用了flip()后使用的,remaining()是返回limt-position的值(缓冲区可读数据的大小)!hasRemaining()则是判断当前是否有数据,返回position <limit的boolean值!
- putXXX()
将数据放入到缓冲区