`
niedj
  • 浏览: 30483 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

转:Mina框架研究(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有两种定义:

 

 // Allocates a new buffer with a specific size, defining its type (direct or heap)
 public static IoBuffer allocate(int capacity, boolean direct)
 
// Allocates a new buffer with a specific size
 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)的用法:
// 设置Allocates分配的默认类型,这里设为heap buffer.
IoBuffer.setUseDirectBuffer(false);
// 返回一个新的heap buffer.
IoBuffer buf = IoBuffer.allocate(1024);
 IoBuffer允许生成一个自动扩展的buffer(这也是没有选择使用NIO的ByteBuffer的原因之一);通过设置AutoExpand属性即可:
    IoBuffer buffer = IoBuffer.allocate(8);
    buffer.setAutoExpand(true);
     
    buffer.putString("12345678", encoder);
           
    // Add more to this buffer
    buffer.put((byte)10);
 转自:http://www.cnblogs.com/xiekeli

 

分享到:
评论

相关推荐

    Mina 框架研究与实现

    Mina框架研究与实现 Mina框架研究与实现

    资料_MINA(2、3、4).rar

    资源包括: MINA笔记.docx MINA2官方教程翻译.pdf Mina2.0快速入门与源码剖析...MINA网络框架和RMI的对比研究.pdf 基于3G网络的移动流媒体服务器的设计与实现.pdf 高性能通信框架及智能主站技术研究.nh MINA类图.doc 等

    mina sslfilter大用法

    这是我学习apache mina框架中研究ssl过滤器u做的一个测试的例子。希望对于刚刚学习mina框架的朋友有所帮助。如果有什么疑问可以发送到我的emai:pengli.bj@163.com与我联系

    Java Netty技术研究

    为什么不是 为什么不是 MinaMina Mina? 1、都是 Trustin LeeTrustin LeeTrustin Lee Trustin Lee Trustin LeeTrustin LeeTrustin LeeTrustin LeeTrustin Lee的作品, 的作品, 的作品, NettyNettyNetty 更晚; 更...

    论文研究-面向家庭物联网的云计算架构.pdf

    基于MINA框架和JMS消息服务设计出家庭物联网的消息管理机制, 根据HBase数据库设计家庭物联网的数据存储模型以实现数据存储分区, 采用MapReduce技术实现家庭物联网的数据分析及数据挖掘, 从而构建出完备的家庭物联网...

    基于微信小程序的学生活动管理系统的设计与实现

    2.3 微信小程序的 MINA 框架 2.4 微信小程序云开发 2.5 微信 Web 开发者工具 2.6 本章小结 第三章 系统需求分析 3.1 系统用户定义 3.2 学生功能 3.2.1 学生注册功能 3.2.2 学生登陆功能 3.2.3 学生个人信息查改功能 ...

    基于微信小程序的酒店管理系统研究设计的开题报告

    使用微信开发者工具进行开发,采用MINA框架,运用WXML、WXSS设计前端页面,MySQL来存储数据,能够使微信小程序前端和服务器后端进行数据交互和通信从而实现酒店管理系统。 (1)系统功能模块设计 本系统分为前台系统...

    基于MINA开发高性能网络应用程序———以实现XMPP协议Openfire3 .3 .3为例 (2008年)

    介绍了XMPP协议、Openfire开源项目以及MINA框架.研究Openfire3 .3 .3中如何使用MI-NA框架部分,对服务器端监听连接、XMPP协议编解码类、业务实现逻辑类、简单的通信统计实现、Openfire的启动等进行分析.结果表明,MINA...

    java开源包101

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    Java毕业设计:基于springboot邑信闲置书本交易小程序的研制(源码+文档+录像演示).zip

    小程序 MINA SpringBoot 在线教育 本文即基于微信小程序平台,开发设计一款基于Java的二手书交易平台,并提供基于B/S机构的后台管理系统。 小程序——主页模块 首页模块可以浏览平台上已发布的待售书籍名称、简介...

    基于PHP微信小程序的助农系统的设计与实现

    本文主要研究基于微信小程序和 TinkPHP 5 框架设计与开发的助农系统。 该系统是在互联网飞速发展和电商物流快速发展的背景下应运而生的,为解决 农户销售农产品难和消费者购买绿色无害农场品难的问题而设计的。 对于...

    mina-1.1.7.rar_网络编程_Java_

    apache 非阻塞通信框架,非常好,但有些地方比较难,至今没研究明白。

    AICLASS:高校签到微信小程序

    客户端使用微信团队开发的MINA逻辑框架;云服务端使用腾讯云开发的wafer-2后端开发框架;服务端与mysql数据库交互使用knex.js连接。本系统建立的学生考勤管理机制,为教师及时反馈学生到课率,极大地改善老师的点名...

    基于springboot邑信闲置书本交易小程序的研制.zip

    小程序 MINA SpringBoot 在线教育 本文即基于微信小程序平台,开发设计一款基于Java的二手书交易平台,并提供基于B/S机构的后台管理系统。 小程序——主页模块 首页模块可以浏览平台上已发布的待售书籍名称、简介...

Global site tag (gtag.js) - Google Analytics