电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

Mina框架研究


发布日期:2019/10/10
 

IoService

IoService是一个接口有两种实现IoAcceptor和IoConnector;其中IoAcceptor是针对Server端的实现IoConnector是针对Client端的实现IoService的职责包括

监听器管理

IoHandler

IoSession管理

FilterChain管理

Statistics管理

IoAcceptor

主要用于创建新的连接MINA提供了多种实现所以几乎不需要我们自己再去实现

NioSocketAcceptor无阻塞的Socket 传输Acceptor针对TCP

NioDatagramAcceptor : 无阻塞的Socket 传输Acceptor针对UDP

AprSocketAcceptor : 阻塞的Socket 传输Acceptor基于 APR

VmPipeSocketAcceptor : the inVM Acceptor

IoConnector

针对Client端的Socket连接有多种实现

NioSocketConnector : 无阻塞的Socket 传输Connector针对TCP

NioDatagramConnector : 无阻塞的Socket 传输Connector针对UDP

AprSocketConnector : 阻塞的Socket 传输Connector基于 APR

ProxyConnector : 一个支持代理服务的 Connector 通过截取连接的请求并将终端指向代理设置的地址

SerialConnector : 针对串口传输的Connector

VmPipeConnector : the inVM * Connector*

Session

任何时候只要有新的连接到来都会生成一个Session对象并且一致保存在内存中只到连接断开

Session有一系列状态如下

Connected : session被创建并有效

Idle : session至少在一个空闲周期(见配置)内没有处理过任何请求

Idle for read : 在一个空闲周期内没有做实际的读操作

Idle for write : 在一个空闲周期内没有做实际的写操作

Idle for both : 在一个空闲周期内没有做实际的读和写操作

Closing :session正在被关闭

Closed : session已经被关闭

IoBuffer

IoBuffer是MINA内部使用的一个byte bufferMINA并没有直接使用NIO 的ByteBuffer不过IoBuffer 是对 ByteBuffer 的一个封装IoBuffer 中的很多方法都是对 ByteBuffer 的直接继承只是对 ByteBuffer 添加了一些扩展了更加实用的方法

基本用法

由于IoBuffer是对Nio的ByteBuffer 的封装所以基本概念还是相同的下面简单介绍一下

capacity该属性描述这个缓沖区最多能缓沖多少个元素也是Buffer最大存储元素数这个值是在创建Buffer的时候指定的且不能修改

Limit在从Buffer中向Channel中写数据时limit变量指示了还剩多少数据可以读取在从Channel中读取数据到Buffer中时limit变量指示了还剩多少空间可供存放数据position正常情况下小于或者等于limit

PositionBuffer实际上也就是个array当你从Channel中读数据时你把从Channel中读出来的数据放进底层arrayposition变量用来跟蹤截止目前为止已经写了多少数据更精确的讲它指示如果下次写Buffer时数据应该进入array的哪个位置因此如果已经从Channel中读出了个字节Buffer的position会被置为指向array中第四个位置

Mark一个可以记忆的Position位置的值在调用reset()方法时会将缓沖区的Position重置为该索引并非总是需要定义Mark但是在定义Mark时不能将其定义为负数并且不能让它大于Position如果定义了Mark则在该Position或Limit调整为小于该Mark值时该Mark将被丢弃

下面通过一个例子来说明

i初始状态下

此时position为limit和capacity都被设为

ii从Channel中读入个字节数据到Buffer这时position指向(第个)

iii在做写操作之前我们必须调用一次flip()方法这个方法做了两件重要的事情

将limit设置到当前的position处

设置position为

iiii执行写操作后;

iv执行clear后position设为limit设为capitionmark则丢弃

因为IoBuffer是一个抽象类不能直接实例化所有使用的时候需要调用allocate方法来进行内存分配

allocate有两种定义

: // Allocates a new buffer with a specific size defining its type (direct or heap)

: public static IoBuffer allocate(int capacity boolean direct)

:

: // Allocates a new buffer with a specific size

: public static IoBuffer allocate(int capacity)

这里

capacitybuffer的大小

direct如果为true则得到direct buffer如果为false则得到heap buffer

direct buffer和heap buffer的区别分析

Direct Buffer不是分配在堆上的它不被GC直接管理(但Direct Buffer的JAVA对象是归GC管理的只要GC回收了它的JAVA对象操作系统才会释放Direct Buffer所申请的空间)它似乎给人感觉是内核缓沖区(buffer in kernel)Heap Buffer则是分配在堆上的或者我们可以简单理解为Heap Buffer就是byte[]数组的一种封装形式当我们把一个Heap Buffer写入Channel的时候实际上底层实现会先构建一个临时的Direct Buffer然后把Heap Buffer的内容复制到这个临时的Direct Buffer上再把这个Direct Buffer写出去因此把一个Direct Buffer写入一个Channel的速度要比把一个Heap Buffer写入一个Channel的速度要快但是Direct Buffer创建和销毁的代价很高所以要用在尽可能重用的地方

public static IoBuffer allocate(int capacity)的用法

: // 设置Allocates分配的默认类型这里设为heap buffer

: IoBuffersetUseDirectBuffer(false);

: // 返回一个新的heap buffer

: IoBuffer buf = IoBufferallocate();

IoBuffer允许生成一个自动扩展的buffer(这也是没有选择使用NIO的ByteBuffer的原因之一)通过设置AutoExpand属性即可

: IoBuffer buffer = IoBufferallocate();

: buffersetAutoExpand(true);

:

: bufferputString( encoder);

:

: // Add more to this buffer

: bufferput((byte));

上一篇:在构建器里调用构建器

下一篇:将数字转为中文金额的大写方式