Mina2 研究总结

一、Mina框架。

Mina的框架大概是这么个样子:

底层由Java 的NIO 1.0实现 核心架构应该是这样:

内部有三个层次:

I/O Service:实际执行的 I / O ,可以选择现成的Services 如 Acceptor 也可以自己实现。

I/O Filter Chain :由多个过滤器组成的过滤器链,在这个环节将字节过滤或转换为预想的数据结构,反之亦然。

I/O Handler :实际的业务逻辑部分。

Server 端应用,创建一个基于 MINA 的应用程序,主要分为三步、

1、Create I/O Service 。IOAcceptor 监听指定的端口,处理网络连接请求;一旦一个新的连接到达,IOAcceptor 产生一个session,后续所有从这个IP和端口发送过来的请求都将被这个Session处理。

2、Create Filter Chain。从现有的Filters 中选择或者创建一个传输 Request / Response 的自定义的Filter 。Session创建之后所有的数据包都被放到过滤器链中,通过过滤器将原始的字节码转变为高层的对象,继承这两个接口完成自己的编码解码 ProtocolEncoderAdapter     ProtocolDecoderAdapter

3、Create I/O Handler。 最终数据包或者对象被传送给Handler 做业务逻辑处理。

二、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 in VM Acceptor

IoConnector:

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

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

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

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

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

SerialConnector:针对串口传输的Connector

VmPipeConnector:the in vm Connector

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

Session状态包括:

五、IoBuffer。IoBuffer是MINA内部的byte buffer,是对Java NIO ByteBuffer的封装,同时扩展了一些更加实用的方法。

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

Limit 是从Buffer中向Channel中写入数据时,limit变量指示还剩多少数据可以读取,在从Channel中读取数据到Buffer 中时,limit变量指定还剩多少空间可以存放数据,position正常情况应该小于等于 limit

Position Buffer实际上也是一个Array,当从Channel 读取数据时,将读出来的数据放进底层array,position 变量用来跟踪截止目前为止已经写入多少数据。它指示如果下次写入Buffer时数据应该进入那个Array位置,比如已经读取10字节,position被置为10,指向array第四个位置。

Mark:一个可以记忆的Position位置的值,调用 reset() 方法时会将Position重置为该索引的值,但是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 方法进行内存分配

IoBuffer buf = IoBuffer.allocate(len);
			IoBuffer buf1 = IoBuffer.allocate(len, true);

默认direct 是false,得到 heap buffer,如果是true 得到 direct buffer。

Direct Buffer 不是分配在堆上,不被GC管理(但是java对象归GC管理,所以GC回收了对象,direct申请的空间也会被释放)。

Heap Buffer 分配在堆上,可以理解为byte[]的封装。但是当我们把heap buffer写入Channel时,底层会先构建一个临时DirectBuffer,然后复制heap buffer内容,再把这个 direct buffer写出去,因为 direct buffer写入Channel速度快,但是创建和销毁的代价高,所以在能够重用的地方使用。

IoBuffer允许生成一个自动扩展的buffer,设置 AutoExpand属性实现,

IoBuffer buffer = IoBuffer.allocate(8);
			 buffer.setAutoExpand(true);
			 buffer.putString("12345678", encoder);
			 // Add more to this buffer
			 buffer.put((byte)10);

clear() : limit = capacity  position = 0;重置 mark ,不清空数据,而是从头开始存放新的数据,相当于覆盖老数据。

reset():清空数据

remaining() :返回  limit - position的值。

hasRemaining() :判断当前是否有数据,返回position < limit 的boolean 值

时间: 2024-12-24 05:34:32

Mina2 研究总结的相关文章

【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战

概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty4(Netty5已经被取消开发了:详见此文). 本文中,服务端将分别用MINA2和Netty4进行实现,但在你实际的项目中服务端实现只需选其一就行了.本文中的Demo同时

【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同时用MINA2和Netty4分别实现服务端的目的,是因为很多人都在纠结到底是用MINA还是Netty来实现高并发的Java网络通信服务端,在此干脆两个都实现了,就看你怎么选择了,够吊吧. NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,M

Google帝国研究——Google的产业构成

                                                                                    Google帝国研究--Google的产业构成 摘要:Google帝国研究  产业构成 作者:魏春颖 文章来源:网络整理 Google产业的构成: 1.    业务板块: 包括互联网搜索.云计算.广告技术,开发并提供大量基于互联网的产品与服务,开发线上软件.应用软件,还涉及移动设备的Android操作系统以及操作系统谷歌Chrom

今天研究了一下手机通信录管理系统(C语言)

题目:手机通信录管理系统 一.题目要求 二.需求分析 三.设计步骤/编写代码 四.上机/运行结果 五.总结 一.题目要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理操作.功能要求: (1)查看功能:A:办公,B:个人,C:商务 (2)增加联系人:录入新数据(姓名,电话,分类,邮箱:weiyang,153********,个人,[email protected]) (3)修改功能:选中某人的姓名,可对其数据进行修改操作 (4)删除功能:选中某人姓名,可对此人的相应数据进行删除,并自动调整

tablib.Dataset()操作exl类型数据之“类方法”研究

#tablib.Dataset()操作exl类型数据之“类方法”研究 import tablib #初始化 data=tablib.Dataset() #设置列标题 data.headers=('name','where') some_collector=[('xiaodeng','enshi'),('xiaoming','hubei'),('xiaodong','enshi')] #写入数据 for key,value in some_collector: data.append((key,v

.NET4.5中WCF中默认生成的basicHttpsBinding的研究

起因: 使用.net4.5建立了一个空白的WCF服务.默认使用的绑定配置是basicHttpsBinding. 问题发现: 1.用客户端进行服务引用,生成了默认的配置文件,其中绑定配置是basicHttpBinding. 2.因为需要单次传递大批量数据,所以修改绑定配置,如下: <basicHttpBinding> <binding name="BasicHttpBinding_IService" closeTimeout="00:10:00" r

原生移动app框架inoic功能研究

本篇只侧重框架提供的功能和能力的研究,请关注后续实际部署使用体验. 一.inoic是什么? inoic是一个可以使用Web技术以hybird方式开发移动app的前端开源框架. 二.inoic框架特点 1. 利用web技术开发移动app. ionic提供了一套HTML.CSS.JS的类库.我们可以使用其提供的CSS组件和工具构建具有良好交互性的app. 2. 关注性能 ionic框架以更少的DOM操作,零JQuery和硬件加速过度,在现代最新的移动设备上性能表现优越. 3.Angular ioni

bzoj1968【AHOI2005】COMMON 约数研究

1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1492  Solved: 1139 [Submit][Status][Discuss] Description Input 只有一行一个整数 N(0 < N < 1000000). Output 只有一行输出,为整数M,即f(1)到f(N)的累加和. Sample Input 3 Sample Output 5 HINT Source Day2

2016年安天365研究课题第1期研究题目与方向

一.数据库密码获取与破解 1.Access数据库破解实战(已经完成) 2.巧用Cain破解MYSQL数据库密码(已经完成) 3.SQL Server 2000口令扫描案例(已经完成) 4.通过网页文件获取数据库账号和口令(已经完成) 5.数据库口令获取与破解(已经完成) 二.Windows操作系统密码获取与破解 1.安全设置操作系统密码研究(已经完成) 2.克隆用户攻击与防范(已经完成) 3.使用GetHashes软件获取Windows系统(已经完成) 4.使用Ophcrack破解系统Hash密