`
nannan408
  • 浏览: 1771192 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

架构师之mima-----------------mina的非NIO控制IOBuffer(说得比较好)

 
阅读更多
1.前言。
  如题。
2.代码。
 
IoService

IoService是一个接口,有两种实现:IoAcceptor和IoConnector;其中IoAcceptor是针对Server端的实现,IoConnector是针对Client端的实现;IoService的职责包括:

1、监听器管理

2、IoHandler

3、IoSession管理

4、FilterChain管理

5、Statistics管理

image

 

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已经被关闭

image

 

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;

image

 

ii、从Channel中读入4个字节数据到Buffer,这时position指向4(第5个):

image

 

iii、在做写操作之前,我们必须调用一次flip()方法,这个方法做了两件重要的事情: 
1. 将limit设置到当前的position处。 
2. 设置position为0。

image

 

iiii、执行写操作后;

image

iv、执行clear后,position设为0,limit设为capition,mark则丢弃;

image

 

 

因为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);



转自:http://www.cnblogs.com/xiekeli/archive/2012/10/16/2725389.html
分享到:
评论

相关推荐

    mimaxueyuan-mima-cloud-parent-hoxton-master.zip

    【标题】"mimaxueyuan-mima-cloud-parent-hoxton-master.zip" 是一个压缩包文件,其中包含的项目可能是某个开源项目 "mimaxueyuan" 的源代码分支 "mima-cloud-parent-hoxton" 的主分支。"master" 通常指的是Git仓库...

    51单片机密码锁51-lcd-mima-duoji

    该资源内项目源码是个人的课程设计作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!...

    mima-web:A password manage using a web server. 一个有特色的密码管理器

    mima-webA password manage using a web server.本软件是一个有特色的密码管理器,需要由用户自行架设到一台 Linux 服务器中。采用简单有效的 NaCl (libsodium) 加密方式(该方式以 “容易正确处理” 为最大特点),...

    Python库 | mima-0.1.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:mima-0.1.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    mima框架所需的包集合

    3. **mina-concurrent**:这部分可能包含对并发工具类的扩展,如锁、信号量、条件变量等,这些工具能够帮助开发者更好地控制并发行为。 4. **mina-annotations**:可能包含用于注解驱动编程的元素,使得代码更加...

    mina2.0.9下载

    当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。 Apache MINA 2.0.9 发布,此版本是个 bug 修复版本,修复了...

    MIMA - Multiprotocol IM Annotations Lib-开源

    MIMA是Java的Multiprotocol Instant Messenger注释库,它提供了一个简单且统一的注释驱动的api,用于通过AIM,Yahoo,GTalk / Jabber和IRC协议开发消息传递业务功能和Messenger bot。

    mima框架的一些基本属性

    MIMA框架(这里可能是笔误,应为MINA框架)是Apache软件基金会下的一个项目,它提供了丰富的工具和API来帮助开发者构建高效、可伸缩的网络应用程序。本标题旨在介绍MIMA框架的核心特性及其在实际应用中的作用。 ###...

    serv-u-mima.rar_ROOT

    远程修改SERV-U帐号密码,本程序能够构建一个远程的修改serv-u帐号密码的web页面,方便广大的FTP维护管理员。 本程序由linglin开发,如果您在使用过程中有任何问题或者疑问请联系root@linglin.org ... ...

    C语言:密码验证-程序控制台

    char mima_1[30],mima_2[30];//用来储存密码的数组 int loop_1; char dh_1[6];//用于记录输入的程序代号 printf(" 欢迎进入程序控制台\n"); printf("-------------------------------------------------------...

    使用mima框架实现安卓心跳包

    它包括了缓冲区(Buffer)、过滤器链(Filter Chain)和会话(Session)等核心概念,简化了网络编程的复杂性。 2. **心跳包设计**: - **心跳包结构**:心跳包通常包含一个标识符,表明这是心跳消息,以及发送...

    最土团购程序管理员密码强制修改

    上传后,浏览根目录下的mima.php即可 你的域名/mima.php -------------------------- 1、修改后,请务必删除根目录下的mima.php文件! 2、由于部分人士卖插件,有时需要提供后台测试,而有些人素质比较低,修改...

    约瑟夫问题 c语言 循环链表

    #include "stdafx.h" #include #include //-------------------------------------------------------- typedef struct jos { int order;... int mima;//每个人的密码 struct jos *link; }Node;

    mima示例项目 mima示例项目

    1.启动服务端程序 2.Windows 下开始菜单,运行,输入cmd,回车 3.输入:telnet 127.0.0.1 3005 回车 4.输入:telnet 127.0.0.1 3005 回车 5.telnet 中随便输入一个字符串,回车 则可以看到返回的日期 ...

    中原地产金地MIMA项目营销策略报告.pptx

    【中原地产金地MIMA项目营销策略报告】是关于房地产市场营销的一个详细规划,旨在通过精心设计的策略推动金地MIMA项目的成功销售。该报告主要围绕三个方面展开:总体营销策略、卖点整合以及入市时机分析与选择。 1....

    Memory-record-password.rar_memory_内存记录mima

    这种技术通常用于提高用户体验,让用户免去反复输入密码的麻烦,但同时也涉及到安全问题,因为如果内存中的数据没有得到妥善保护,可能会被恶意软件或者黑客利用。 在计算机科学中,内存(Memory)是计算机处理信息...

    汽车销售系统

    是关于C的系统void denglu() { int n; system("cls"); printf("\n 登录请选择人员 \n");... mima1(); break; case 2:printf("\n\t|------员工登录-----|"); mima2(); break; case 0: break;

    HasagawaMima:Hasagawa Mima方程的模拟-matlab开发

    总的来说,通过这个MATLAB项目,你可以深入理解Hasagawa-Mima方程的物理背景,掌握数值求解非线性PDE的方法,并提升在MATLAB中的编程和数据分析能力。这是一个很好的机会,不仅能够深化理论知识,还能实践解决实际...

    JAVA数据库课程设计--学生选课管理系统的.doc

    具体来说: - **用户登录**:系统支持用户通过输入账号和密码的方式登录。 - **学生信息管理**:提供对学生基本信息(如学号、姓名、系别等)的增删改查功能。 - **课程信息管理**:支持对课程的基本信息(如课号、...

    Ubuntu查看修改mysql的登录名和密码、安装phpmyadmin

    安装好mysql后,在终端输入 mysql -u root -p 按回车,输入密码后提示access denied……ues password YES/NO的错误 原因是用户名或密码不对! 查看、修改mysql的用户名和密码 第一步: 这时你需要进入/etc/mysql目录...

Global site tag (gtag.js) - Google Analytics