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()

           将数据放入到缓冲区

猜你喜欢

转载自blog.csdn.net/x3499633/article/details/81195451