一、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. 安卓开发-Activity中finish() onDestroy() 和System.exit()的区别

    Activity.finish()Call this when your activity is done and should be closed. 在你的activity动作完成的时候,或者Act ...

  2. HDU 5009 DP

    2014 ACM/ICPC Asia Regional Xi'an Online 对于N个数 n(1 ≤ n ≤ 5×104), 把N个数分成随意个区间,每一个区间的值是该区间内不同数字个数的平方和, ...

  3. PyDev下PyQt 的尝试

    刚刚装完PyDev ,试了下之前写的调用PyQt的下代码,发现运行出错:搜索只还需在System PYHONPATH下 添加PyQt的路径,步骤如下: eclipse--window--Prefere ...

  4. 如何创建C++程序

    下载Microsoft Visual C++ 6.0请点击这里:VC 6.0下载(包括中文版英文版)(支持Win7和XP) 首先,我们要进入Microsoft Visual C++集成开发环境(Int ...

  5. 关于C++异常机制的笔记(SEH, try-catch)

    昨天晚上加班解决了一个问题,是由于无法正确的捕获到异常导致的.刚开始用try-catch,但是没法捕获到异常:后面改成SEH异常才解决.因此今天将这个问题重新梳理了一遍,关于try-catch, SE ...

  6. 列表标题栏添加CheckBox(自定义HanderView的时候实现)

    前段时间项目上的要求,要实现一个列表(见下图1).类似网页上的列表,可以通过选中标题栏的复选框,实现全选或者全不选的功能.但是看了很久,都没看到Qt哪个方法可以实现在标题栏添加控件. 图1 要实现这样 ...

  7. IntelliJ IDEA 开发swing(一)

    原文:idea开发swing(一) 最近项目组需要开发一个swing小工具,以下是开发过程. 一.创建工程: 输入工程名称,选择java module,点击next 接下来什么都不选点击finish, ...

  8. Linux 命令整理

    一.文件目录命令 1.建立目录:mkdir 目录名 2.删除空目录:rmdir 目录名 3.无条件删除子目录: rm -rf 目录名 4.改变当前目录:cd 目录名 (进入用户home目录:cd ~; ...

  9. 基于visual Studio2013解决面试题之1001去除数字

     题目

  10. CIconListBox带图标的列表框类

    有时候,我们需要在列表框ListBox中插入带图标的文字项,这就需要自己派生一个类出来了,网上的一个CIconListBox类还不错,网站http://www.codeguru.com/Cpp/con ...