一、Mina框架。

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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmFueXVuNzY1NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

内部有三个层次:

I/O Service:实际运行的 I / O ,能够选择现成的Services 如 Acceptor 也能够自己实现。

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

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

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

1、Create I/O Service 。IOAcceptor 监听指定的port。处理网络连接请求;一旦一个新的连接到达,IOAcceptor 产生一个session,兴许全部从这个IP和port发送过来的请求都将被这个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速度快,可是创建和销毁的代价高。所以在可以重用的地方使用。

大文件时,heap buffer复制代价高。用DirectBuffer可以提高性能。下载文件除了SendFile机制还有 内存映射 MappedByteBuffer 直接将文件写入SocketChannel。降低数据复制,提高性能。

总之反复可用的信息可以放在 Direct Buffer。

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 值

六、优化指南。

1、mina能够指定使用 direct 或者 heap memory实现buffer池。1.X版本号须要自己设置

<span style="font-size:18px;">ByteBuffer.setUseDirectBuffers(false);
ByteBuffer.setAllocator(new SimpleByteBufferAllocator());</span>

2.x已经默认把直接内存分配改成堆。

2、将应用部署在linux上面而且打开 epoll 功能。

JDK6 已经默认打开,其它版本号能够通过參数打开。

Mina2 研究总结的更多相关文章

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

    概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...

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

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  3. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

  4. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  5. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  6. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

  7. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  8. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  9. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...

随机推荐

  1. JS - 按钮倒计时

    效果: html代码: <input type="button" id="btn" value="点击获取效验码" /> js代 ...

  2. 彻底明白Java的IO系统

    java学习:彻底明白Java的IO系统 文章来源:互联网 一. Input和Output1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源.在Java的IO中,所有 ...

  3. The Meta-Object System

    The Meta-Object System Qt元对象系统为对象之间的交互提供了信号与槽机制,运行时信息和动态属性系统. 元对象系统基于三件事: 1.      Qobject类作为所有要利用元对象 ...

  4. perl 回调必须是函数引用

    [root@wx03 lib]# cat a1.pl use AE; use AnyEvent; ##定义watch my $t = AnyEvent->timer( after => 0 ...

  5. Oracle单表的简单查询

    Oracle单表的简单查询 查看表结构 desc emp; 查询所有列 Select * from emp; 查找所以部门编号(查指定的列) select deptnofrom emp; 查找编号不同 ...

  6. 利用navicat for oracle将数据库全部数据移动

    话不多说.直接上图. 1.首先选择自己的数据库. 右键,data transfer 2.选择相应源数据库,目标数据库.点击start就可以.假设中间失败,可多尝试几次. 2.

  7. POJ 2112 Optimal Milking (二分+最短路径+网络流)

    POJ  2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K To ...

  8. 百度地图api基本用法

    首先 ,如果想调用百度地图api,你需要获取一个百度地图api的密钥. 申请密钥很简单,在百度地图api的首页就有相关链接,填写相关信息百度就会给你一个密钥了. 接下来,就是引入百度地图的api 关键 ...

  9. javascript笔记整理(window对象)

    浏览器对象模型 (BOM--Browser Object Model),window对象是BOM中所有对象的核心 A.属性 1.(位置类型-获得浏览器的位置) IE:window.screenLeft ...

  10. Linux权限操作 [转]

    Linux权限操作 本文内容来自<鸟哥linux私房菜>读后个人做的笔记,该书实为学习linux的很好入门教材 一.文件属性 ls ls -al列出所有的档案属性 ls是List的意思 档 ...