Apache Mina2 IoService详解
来源:互联网 发布:卖衣服游戏无网络 编辑:程序博客网 时间:2024/05/16 00:44
IoService
IoService是一个接口,有两种实现:IoAcceptor和IoConnector;其中IoAcceptor是针对Server端的实现,IoConnector是针对Client端的实现;IoService的职责包括:
1、监听器管理
2、IoHandler
3、IoSession管理
4、FilterChain管理
5、Statistics管理
IoAcceptor
主要用于创建新的连接。MINA提供了多种实现,所以几乎不需要我们自己再去实现:
NioSocketAcceptor:无阻塞的Socket 传输Acceptor,针对TCP
NioDatagramAcceptor : 无阻塞的Socket 传输Acceptor,针对UDP
AprSocketAcceptor : 阻塞的Socket 传输Acceptor,基于 APR
VmPipeSocketAcceptor : the in-VM Acceptor
IoConnector
针对Client端的Socket连接,有多种实现:
NioSocketConnector : 无阻塞的Socket 传输Connector,针对TCP
NioDatagramConnector : 无阻塞的Socket 传输Connector,针对UDP
AprSocketConnector : 阻塞的Socket 传输Connector,基于 APR
ProxyConnector : 一个支持代理服务的 Connector ,通过截取连接的请求,并将终端指向代理设置的地址。
SerialConnector : 针对串口传输的Connector
VmPipeConnector : the in-VM * 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 buffer,MINA并没有直接使用NIO 的ByteBuffer。不过IoBuffer 是对 ByteBuffer 的一个封装。IoBuffer 中的很多方法都是对 ByteBuffer 的直接继承。只是对 ByteBuffer 添加了一些扩展了更加实用的方法。
基本用法
由于IoBuffer是对Nio的ByteBuffer 的封装,所以基本概念还是相同的,下面简单介绍一下:
1、capacity:该属性描述这个缓冲区最多能缓冲多少个元素,也是Buffer最大存储元素数,这个值是在创建Buffer的时候指定的,且不能修改。
2、Limit:在从Buffer中向Channel中写数据时,limit变量指示了还剩多少数据可以读取,在从Channel中读取数据到Buffer中时,limit变量指示了还剩多少空间可供存放数据。position正常情况下小于或者等于limit。
3、Position:Buffer实际上也就是个array。当你从Channel中读数据时,你把从Channel中读出来的数据放进底层array,position变量用来跟踪截止目前为止已经写了多少数据。更精确的讲,它指示如果下次写Buffer时数据应该进入array的哪个位置。因此如果已经从Channel中读出了3个字节,Buffer的position会被置为3,指向array中第四个位置。
4、Mark:一个可以记忆的Position位置的值,在调用reset()方法时会将缓冲区的Position重置为该索引,并非总是需要定义Mark,但是在定义Mark时,不能将其定义为负数,并且不能让它大于Position,如果定义了Mark,则在该Position或Limit调整为小于该Mark值时,该Mark将被丢弃。
下面通过一个例子来说明:
i、初始状态下:
此时position为0,limit和capacity都被设为9;
ii、从Channel中读入4个字节数据到Buffer,这时position指向4(第5个):
iii、在做写操作之前,我们必须调用一次flip()方法,这个方法做了两件重要的事情:
1. 将limit设置到当前的position处。
2. 设置position为0。
iiii、执行写操作后;
iv、执行clear后,position设为0,limit设为capition,mark则丢弃;
因为IoBuffer是一个抽象类,不能直接实例化,所有使用的时候需要调用allocate方法来进行内存分配;
allocate有两种定义:
1: // Allocates a new buffer with a specific size, defining its type (direct or heap)
2: public static IoBuffer allocate(int capacity, boolean direct)
3:
4: // Allocates a new buffer with a specific size
5: public static IoBuffer allocate(int capacity)
这里:
capacity:buffer的大小;
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)的用法:
1: // 设置Allocates分配的默认类型,这里设为heap buffer.
2: IoBuffer.setUseDirectBuffer(false);
3: // 返回一个新的heap buffer.
4: IoBuffer buf = IoBuffer.allocate(1024);
IoBuffer允许生成一个自动扩展的buffer(这也是没有选择使用NIO的ByteBuffer的原因之一);通过设置AutoExpand属性即可:
1: IoBuffer buffer = IoBuffer.allocate(8);
2: buffer.setAutoExpand(true);
3:
4: buffer.putString("12345678", encoder);
5:
6: // Add more to this buffer
7: buffer.put((byte)10);
- Apache Mina2 IoService详解
- MINA2.0用户手册中文版--第三章 第一节 IoService接口简介
- MINA2.0用户手册中文版--第三章 第一节 IoService接口简介
- Apache Mina2.0
- apache mina2.0
- Apache Mina2学习笔记
- Apache Mina2 框架研究
- Apache MINA 框架之IoService介绍
- Apache Mina 学习笔记(3) - IoService
- Apache Mina的IoService接口学习笔记
- MINA2 核心源代码分析笔记 - 2. IoAcceptor与IoConnector类族 (IoService)
- MINA2.0用户手册中文版--第三章 第二节 IoService接口详情
- MINA2.0用户手册中文版--第三章 MINA的IO服务接口IoService
- MINA2.0用户手册中文版--第三章 第二节 IoService接口详情
- apache mina2.0核心架构
- Apache mina2用户指南(一)
- Apache mina2 用户指南(二)
- apache mina 学习(五)-----IoService接口及实现
- 深入理解Java内存模型(一)——基础 摘录自---<java并发编程的艺术>
- nodejs + async
- Android 自定义PopupWindow 实现 ListView与PopupWindow结合下拉框
- MySQL内容乱码及编码问题处理
- 安卓SQLite unable to open database file (code 14)异常
- Apache Mina2 IoService详解
- android系统架构MVP案例分析
- 自定义datePicker的实现
- SSL握手过程(访问https)
- 在线创建dg环境 adg
- C++虚表与多态
- BigDecimal函数使用
- slf4j+logback使用
- Apache Mina2 框架研究