`
niedj
  • 浏览: 31109 次
  • 性别: 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框架正是...

    JAVA mina 框架源码

    JAVA Mina框架是一款高度可扩展、高性能的网络应用开发框架,专为Java平台设计。它提供了丰富的网络通信API,使得开发者能够轻松地构建基于TCP/IP、UDP/IP以及其他协议的服务器和客户端应用程序。Mina框架的核心设计...

    apache-mina-2.0.4.rar_apache mina_mina

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...

    mina2框架+实例教程

    **Mina2框架详解与实例教程** Mina2(全称Apache MINA,Multipurpose Infrastructure for Network Applications)是一个高性能、事件驱动的网络应用程序框架,主要应用于开发网络通信应用,如TCP/IP和UDP/IP协议栈...

    Mina入门:mina版之HelloWorld

    Apache Mina是一个开源项目,它提供了一个高度模块化、高性能的网络通信框架。Mina旨在简化网络应用的开发,支持多种传输协议,如TCP、UDP、HTTP、FTP等。在这个“Mina入门:Mina版之HelloWorld”教程中,我们将探讨...

    mina框架源码及jar包

    在本压缩包"apache-mina-2.0.4"中,包含的是Mina框架的源码和jar包,这为开发者深入理解Mina的工作机制以及自定义功能提供了便利。 **Mina框架的核心概念:** 1. **I/O模型**:Mina基于NIO(Non-blocking I/O)...

    微信小程序 Web MINA框架下载.rar

    微信小程序是一种轻量级的应用开发平台,主要针对移动端,它允许开发者通过微信的开发工具创建出能在微信内部...通过深入研究这个Web MINA框架,开发者能够更好地掌握微信小程序的开发技术,提升自己的项目开发能力。

    mina框架中socket使用,有服务端和客户端。

    8. **学习与实践**:这个项目作为一个完整的示例,非常适合初学者研究和学习MINA框架。通过运行服务端和客户端,可以观察数据交互的过程,理解MINA如何处理网络事件和数据传输。此外,你还可以尝试修改代码,添加新...

    mina框架的使用

    Apache MINA(Multipurpose ...通过研究这些源代码,读者可以更直观地了解MINA框架的使用方法和实现细节。学习这个项目,你可以动手实践MINA的基本用法,理解异步编程模型,以及如何处理网络通信中的各种事件。

    apache下的mina框架的源码

    在深入分析MINA框架源码之前,我们需要理解几个核心概念: 1. **过滤器(Filter)**:MINA采用过滤器链模式处理网络事件,每个过滤器都可以对入站和出站的数据进行处理。过滤器可以用于数据编码、解码、安全处理、...

    mina框架中socket应用的简单小项目,包含了所需jar

    "mina框架中socket应用的简单小项目,包含了所需jar" 这个标题告诉我们这是一个关于使用Apache MINA框架实现的基于Socket通信的小型项目。MINA是一个为高性能网络应用提供高度抽象的Java NIO框架,它简化了网络编程...

    java源码:高性能Java网络框架 MINA.zip

    总而言之,`java源码:高性能Java网络框架 MINA.zip`这个压缩包包含的是MINA框架的源代码,对于希望深入研究Java网络编程、提高系统性能的开发者来说是一份宝贵的资源。通过分析和学习MINA的源码,我们可以了解如何...

    ftpserver mina框架,适合学习

    Apache Mina FTPServer是一个基于Apache Mina框架的轻量级FTP服务器实现,它为开发者提供了构建自定义FTP服务器的能力。这个框架非常适合初学者学习,因为它提供了清晰的结构和丰富的文档,帮助理解网络通信和FTP...

    mina高性能Java网络框架 v2.2.1.zip

    标题"mina高性能Java网络框架 v2.2.1.zip"表明这是Apache MINA框架的一个特定版本——v2.2.1的打包文件,通常包含源代码、文档和其他相关资源。这个版本可能包含了性能优化、bug修复以及新功能的引入,适合用于开发...

    MINA1.7包(源码)

    MINA(Multipurpose Infrastructure for Network Applications)是Apache软件基金会的一个开源项目,主要为构建高性能、跨平台的网络应用程序提供框架。MINA1.7版本是一个成熟的版本,它提供了丰富的网络通信API,...

    基于Java的实例源码-高性能Java网络框架 MINA.zip

    **标题与描述解析** ...总的来说,这个压缩包为Java开发者提供了一个深入理解并实践MINA框架的机会,通过研究源码和示例,可以提升对网络编程和异步事件驱动模型的理解,以及如何利用MINA构建高性能的网络应用。

    mina项目示例

    在压缩包文件"apache-mina"中,可能包含了MINA框架的源码、示例代码、配置文件以及其他相关资源,这些都是学习和研究MINA的好材料。开发者可以通过阅读这些代码,进一步了解MINA在实际应用中的具体实现方式。

    mina框架自定义解编码器

    2. **MINA框架中的编码器与解编码器** MINA提供了一系列预定义的编码器和解编码器,如LineDelimiterDecoder、StringEncoder等,但它们可能无法满足所有复杂场景的需求。因此,自定义解编码器成为了必要的选择。MINA...

    mina高性能Java网络框架 v2.1.6.zip

    - 源代码:完整的MINA框架源码,可以帮助开发者深入理解其内部机制,进行二次开发或调试。 - 文档:可能包括API文档、用户指南和开发者手册,帮助用户快速上手和解决问题。 - 示例:MINA通常会提供示例项目,展示...

Global site tag (gtag.js) - Google Analytics