一、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. 汉高澳大利亚sinox为什么不能下载源代码,因为sinox执行unix/linux/windows规划

    中国用户下载真正的澳大利亚sinox说完后sinox没有下载源代码. 这意味着,类似linux如下载linux 开源安装. 要知道.sinox并非linux. 首先,sinox是商业操作系统,就像 w ...

  2. Android 代码混淆

    什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通 ...

  3. sql: sql developer tunnel转接

    Use putty tunnel instead of login terminal server 有时候本地直接ping不通sql 的server, 但另一个server能连上,这时就可以把端口和i ...

  4. 《火球——UML大战需求分析》(第1章 大话UML)——1.5 小结和练习

    说明: <火球——UML大战需求分析>是我撰写的一本关于需求分析及UML方面的书,我将会在CSDN上为大家分享前面几章的内容,总字数在几万以上,图片有数十张.欢迎你按文章的序号顺序阅读,谢 ...

  5. 大白痴学习webmagic

    摘要 webmagic 学习 从头 刚刚开始学,很多东西可能理解错了,还请各位指教 一些基本类: Request:包含要爬行的url和一些附加信息,是Page的一个成员变量 主要成员变量 String ...

  6. 基于visual Studio2013解决面试题之1310随机数

     题目

  7. java设计模式之观察者模式(9)

    Java观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象.这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者 ...

  8. ASP.NET、WinForm、C# - 配置文件信息读取 [ Web.config || Appconfig ]

    <configuration> <appSettings> <add key="name" value="HF_Ultrastrong&qu ...

  9. 浅谈BFC与应用

    什么是BFC BFC(Block formatting context)的中文翻译我们一般叫做块级格式化上下文.它是一个独立渲染的区域,规定了内部如何布局,同时不受外界的影响.我们的根元素本身就是一个 ...

  10. FMX对象释放

    今天盒子中有朋友遇到对象释放的问题,原文在这里,他的实现大意是建立一个TmyLayout = class(TLayout),然后在这个类中画线,Form对象调用实例化这个类来画线,然后释放掉这个对象, ...