`

Apache Mina 网络通信

 
阅读更多
2011-07-26 13:04:48|  分类: mina |  标签:高并发socke  服务器框架   |字号 订阅
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。Mina 主要有1.x 和2.x 两个分支,这里我们讲解最新版本2.0,如果你使用的是Mina 1.x,那么可能会有一些功能并不适用。学习本文档,需要你已掌握JAVA IO、JAVA NIO、JAVASocket、JAVA 线程及并发库(java.util.concurrent.*)的知识。Mina 同时提供了网络通信的Server 端、Client 端的封装,无论是哪端,Mina 在整个网通通信结构中都处于如下的位置:






1。MINA 框架简介


当客户首次访问采用MINA编写的程序时,IoAcceptor作为线程运行,负责接受来自客户的请求。当有客户请求连接时,创建一个 Session,该Session与IoProcessor、SocketChannel以及IOService联系起来。IoProcessor也作为 另外一个线程运行,定时检查客户是否有数据到来,并对客户请求进行处理,依次调用在IOService注册的各个IoFilter,最后调用 IoHandler进行最终的逻辑处理,再将处理后的结果Filter后返回给客户端。

2。IoSession

Session可以理解为服务器与客户端的特定连接,该连接由服务器地址、端口以及客户端地址、端口来决定。客户端发起请求时,指定服务器地址和端口,客户端也会指定或者根据网络路由信息自动指定一个地址、自动分配一个端口。这个地址、端口对构成一个Session。

Session是服务器端对这种连接的抽象,MINA对其进行了封装,定义了IoSession接口,用来代表客户端与服务器的连接,在服务器端来 指代客户端,实现对客户端的操作、绑定与客户端有关的信息与对象。通过利用Session的这个概念,编写程序时就可以在服务器端非常方便地区分出是当前 处理的是哪个客户端的请求、维持客户端的状态信息、可以实现客户端之间相互通讯。

IoSession提供以下一些常用方法:

(1)setAttribute(Object key, Object value)     getAttribute(Object key)

设置/获取用户定义的属性。

将该属性与session联系起来,方便以后处理用户请求时使用。比如如果要求用户登录后才能继续进行操作,那么在用户成功登陆后,可以通过 setAttribute()设置一个属性,当用户以后继续请求时,可以通过getAttribute()获取该属性来判断用户是否登录。

(2)getRemoteAddress()

获取远程客户端地址。

(3)getId() getCreationTime()   getLastIoTime() getConfig()

获取Session的Id、创建时间、上次IO时间、配置信息。

(4)write(Object message)

将数据发送给客户端。

(5)close()

关闭Session。

说明:可以在Session中发送数据,但是Session没有提供读取数据的方法,读取数据通过另一套机制在IoHandler的messageReceived()中实现。

3。Event

MINA可以看成是事件驱动的。通常在网络通讯中,可以将整个过程划分为几个基本的阶段,如建立连接、数据通信、关闭连接。

数据通信一般包括数据的发送和接收,由于在通信过程中,可能要多次发送和接收数据,以进行不同的业务交互。

不可能一直都接收和发送数据,因此就有Idle出现,在MINA中,如果在设定的时间内没有数据发送或接收,那么就会触发一个Idle事件。

由于某种原因,可能会发生错误,导致系统异常发生,引发exception。

因此,如果从事件发生的角度看的话,就可以在MINA中将通信看成由一个建立链接(sessionCreated 和 sessionOpened )、多个数据接收和发送、一个关闭连接事件以及多个Idle事件等7种事件组成的过程。

Session是对双方相互通信的抽象,因此通信的过程就是一系列与Session相关的事件。

在MINA现在对TCP的实现中,sessionCreated 和 sessionOpened 没有区别。因此严格来说,有6种类型的事件。

4。IoHandler

从以上MINA框架简图可以看出,对来自客户端数据最终处理是在IoHandler中处理的。IoHandler封装了来自客户端不同事件的处理, 如果对某个事件感兴趣,可以实现相应的方法,当该事件发生时,IoHandler中的方法就会被触发执行。IoHandler总共有7个方法对应7个事 件:

(1)void exceptionCaught(IoSession session, Throwable cause)

有异常发生时被触发。

(2)void messageReceived(IoSession session, Object message)

有消息到达时被触发,message代表接收到的消息。

(3)void messageSent(IoSession session, Object message)

发送消息时时被触发,即在调用IoSession.write()时被触发,message代表将要发送的消息。

(4)void sessionClosed(IoSession session)

当连接关闭时被触发,即Session终止时被触发。

(5)void sessionCreated(IoSession session)

当创建一个新连接时被触发,即当开始一个新的Session时被触发。

(6)void sessionIdle(IoSession session, IdleStatus status)

当连接空闲时被触发。使用IoSessionConfig中的setIdleTime(IdleStatus status, int idleTime)方法可以设置session的空闲时间。如果该Session的空闲时间超过设置的值,该方法被触发,可以通过 session.getIdleCount(status)来获取sessionIdle被触发的次数。

(7)void sessionOpened(IoSession session)

当打开一个连接时被触发。在目前的实现中,好像 sessionOpened 和 sessionCreated 没有太大区别,sessionCreated 在 sessionOpened 之前被触发。

IoHandler是一个接口,一般情况没有必要直接实现该接口的每一个方法。MINA提供了一个IoHandlerAdapter类,该类实现了 IoHandler要求的方法,但是都没有做任何处理。当我们要编写自己的Handler时,可以扩展IoHandlerAdapter,重写我们关心的 事件方法即可。比如,一般情况,我们比较关心是否接收到数据这个时间,那么我们就可以覆盖messageReceived方法,不用管其他方法。

5。IoFilter

IoFilter用来对客户的请求或发送给客户的数据进行filter。与IoHandler一样,Filter也是基于事件的,通过实现IoFilter接口,就可以对通信过程中的Session的事件进行处理。

Filter是一种链式结构,与IoHandler不同,处理每一种Session事件的函数中,除了传入session对象外,还传入了 NextFilter对象,用来代表下一个Filter。一般情况,在处理结束后,调用下一个filter的相应方法作进一步处理。Filter也可以针 对特定的通信或数据,不进行进一步处理,就可以不用调用NextFilter的相应方法。

除了与Session相应的7种事件外,在IoFilter中还可以对Filter的init、destroy以及add、remove等时间爱女作出处理。

MINA提供了一个IoFilterAdapter类,我们要编写自己的Filter时,可以扩展IoFilterAdapter,不用直接实现IoFilter接口。

Apache MINA提供一个LoggingFilter类,用来log通信过程。

MINA 基本类的描述

在介绍架构之前先认识几个接口:

IoAccepter 相当于网络应用程序中的服务器端

IoConnector 相当于客户端

IoSession 当前客户端到服务器端的一个连接实例

IoHandler 业务处理逻辑

IoFilter 过滤器用于悬接通讯层接口与业务层接口

图 1:MINA 的架构图


在图中的模块链中,IoService 便是应用程序的入口,相当于我们前面代码中的 IoAccepter,IoAccepter 便是 IoService 的一个扩展接口。IoService 接口可以用来添加多个 IoFilter,这些 IoFilter 符合责任链模式并由 IoProcessor 线程负责调用。而 IoAccepter 在 ioService 接口的基础上还提供绑定某个通讯端口以及取消绑定的接口。在上面的例子中,我们是这样使用 IoAccepter 的:

IoAcceptor acceptor = new SocketAcceptor();

相当于我们使用了 Socket 通讯方式作为服务的接入,当前版本的 MINA 还提供了除 SocketAccepter 外的基于数据报文通讯的 DatagramAccepter 以及基于管道通讯的 VmPipeAccepter。另外还包括串口通讯接入方式,目前基于串口通讯的接入方式已经在最新测试版的 MINA 中提供。你也可以自行实现 IoService 接口来使用自己的通讯方式。

而在上图中最右端也就是 IoHandler,这便是业务处理模块。相当于前面例子中的 HelloHandler 类。在业务处理类中不需要去关心实际的通讯细节,只管处理客户端传输过来的信息即可。编写 Handler 类就是使用 MINA 开发网络应用程序的重心所在,相当于 MINA 已经帮你处理了所有的通讯方面的细节问题。为了简化 Handler 类,MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不做任何处理。

一个 IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文档):

void exceptionCaught(IoSession session, Throwable cause)
                   当接口中其他方法抛出异常未被捕获时触发此方法
void messageReceived(IoSession session, Object message)
                   当接收到客户端的请求信息后触发此方法.
void messageSent(IoSession session, Object message)
                   当信息已经传送给客户端后触发此方法.
void sessionClosed(IoSession session)
                   当连接被关闭时触发,例如客户端程序意外退出等等.
void sessionCreated(IoSession session)
                   当一个新客户端连接后触发此方法.
void sessionIdle(IoSession session, IdleStatus status)
                   当连接空闲时触发此方法.
void sessionOpened(IoSession session)
                   当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发

前面我们提到 IoService 是负责底层通讯接入,而 IoHandler 是负责业务处理的。那么 MINA 架构图中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一个用途却是必须的,那就是作为 IoService 和 IoHandler 之间的桥梁。IoHandler 接口中最重要的一个方法是 messageReceived,这个方法的第二个参数是一个 Object 型的消息,总所周知,Object 是所有 Java 对象的基础,那到底谁来决定这个消息到底是什么类型呢?答案也就在这个 IoFilter 中。在前面使用的例子中,我们添加了一个 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),这个过滤器的作用是将来自客户端输入的信息转换成一行行的文本后传递给 IoHandler,因此我们可以在 messageReceived 中直接将 msg 对象强制转换成 String 对象。

而如果我们不提供任何过滤器的话,那么在 messageReceived 方法中的第二个参数类型就是一个 byte 的缓冲区,对应的类是 org.apache.mina.common.ByteBuffer。虽然你也可以将解析客户端信息放在 IoHandler 中来做,但这并不是推荐的做法,使原来清晰的模型又模糊起来,变得 IoHandler 不只是业务处理,还得充当协议解析的任务。

MINA自身带有一些常用的过滤器,例如LoggingFilter(日志记录)、BlackListFilter(黑名单过滤)、CompressionFilter(压缩)、SSLFilter(SSL加密)等。
分享到:
评论

相关推荐

    Apache Mina网络通信应用框架实例

    Apache Mina Server 是一个网络通信应用框架 基于 TCP/IP、UDP/IP协议栈的通信框架 支持串口和虚拟机内部的管道等传输方式 Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用 Mina 提供了事件驱动、异步操作...

    apache-mina-2.0.4.rar_apache mina_mina

    Apache Mina的核心理念是提供一个简洁的API,使得开发者能够专注于业务逻辑,而不是网络通信的底层细节。它基于Java NIO(非阻塞I/O)构建,允许在高并发场景下高效地处理连接和数据传输。Mina支持多种网络协议,如...

    apache Mina的完整学习资料

    Apache Mina是一个开源框架,主要用于构建高...总的来说,Apache Mina是一个强大的网络通信框架,适合开发高性能的网络应用。通过深入学习和实践,你可以充分利用它的优势,为你的项目带来高效、稳定的网络通信能力。

    Apache Mina Server 是一个网络通信应用框架

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高...

    Apache Mina帮助文档

    Apache Mina是一个高度可扩展的网络通信框架,主要用于构建高性能、高效率的服务端应用程序。它提供了事件驱动、异步I/O处理模型,使得开发者能够更专注于业务逻辑,而不是底层网络编程的复杂性。Mina主要应用于Java...

    apache mina实例免费下载

    总的来说,Apache MINA是一个强大的网络通信框架,其非阻塞I/O和过滤器链设计大大简化了Java网络应用的开发。通过学习和实践MINA的实例,开发者可以提升网络编程技能,构建出更高效、更稳定的网络服务。

    Apache Mina 入门Demo

    Apache Mina是一个开源项目,主要用于构建高性能、高可用性的网络通信应用。它是Java语言开发的,提供了一套简单而强大的API,使得开发者可以方便地创建网络服务器和客户端应用程序。Mina的目标是简化网络编程,使其...

    Apache mina2学习笔记DEMO

    MINA 提供了一套高级的网络通信抽象层,简化了开发过程,特别是对于处理TCP/IP和UDP/IP协议栈的应用。MINA的核心概念是事件驱动和非阻塞I/O,这使得它在处理大量并发连接时表现出色。 在这个"Apache MINA2学习笔记...

    apache mina 学习笔记三(子项目FtpServer)

    Apache MINA FtpServer是一个功能丰富的FTP服务器实现,它利用MINA的高效网络通信框架,提供了高度可定制的选项。通过深入理解其架构和API,开发者可以轻松构建满足特定需求的FTP服务,同时享受到MINA的性能优势。在...

    apache mina-spring 服务端程序

    Apache Mina是一个高度可扩展的网络通信框架,主要用于构建高性能、高并发的网络应用程序,如服务器端应用。它提供了一种简单而强大的编程模型,使得开发者可以专注于业务逻辑,而不是底层的网络通信细节。Spring...

    Apache MINA框架相关资料

    MINA提供了一个抽象层,允许开发者使用Java编程接口来处理网络通信,而无需关注底层的网络细节。 标题中的“Apache MINA框架相关资料”涵盖了对MINA框架的全面学习材料,包括中文参考手册、源码分析、API文档和与...

    一个Apache MINA使用案例源代码ApacheMina

    在Android平台上,尽管MINA并不常见,但在某些需要进行复杂网络通信或跨平台的项目中,它可能会被采用。 MINA的核心概念是IoSession,它代表了服务端与客户端之间的会话。IoSession提供了读写操作、管理会话状态和...

    Apache Mina Server 2.0 抢鲜体验

    Apache Mina Server 2.0 是一款高性能、可扩展的网络通信框架,广泛应用于开发网络应用服务器,如TCP/IP和UDP服务。这个框架允许开发者用Java编写高效的网络应用程序,简化了网络编程的复杂性。Mina 2.0 版本在前一...

    (源码)基于Apache Mina框架的短信通信系统.zip

    Apache Mina Server是一个网络通信应用框架,支持TCPIP、UDPIP协议栈的通信,并提供了事件驱动、异步操作的编程模型。本项目使用Mina 2.0版本,适用于需要快速开发网络通信应用的场景。 ## 项目的主要特性和功能 1...

    Apache mina源代码框架解析

    Apache Mina是一个用Java编写的网络通信框架,它简化了创建高性能、高可用性的网络服务的过程。Mina的核心思想是提供一个与传输层协议无关的API,使得开发者可以专注于业务逻辑,而不需要关心底层的网络通信细节。在...

    Apache-Mina-2.rar_apache mina_java mina_mina_mina-core-1.1.3

    通过使用缓冲区(Buffer)和事件驱动模型,Mina能够有效地管理网络通信,并且降低了CPU的使用率。 "Mina-core-1.1.3"标签则代表了Mina的核心组件,它包含了框架的基础服务,如I/O处理器、过滤器链和事件处理机制。...

    Apache Mina2服务器和客户端简单实例

    Apache Mina2是一个高度可扩展且高性能的网络通信框架,主要设计用于简化开发网络应用,如TCP/IP和UDP协议的服务端和客户端。它提供了一种事件驱动、非阻塞I/O模型,使得开发者能够更专注于业务逻辑,而不是底层的...

    apache-mina例子

    总的来说,Apache Mina提供的这套框架极大地简化了网络应用的开发工作,通过其高度可定制的过滤器机制和非阻塞I/O模型,使得开发者能够更专注于业务逻辑,而不是底层的网络通信细节。在`MinaTimeServer`和`Mina...

Global site tag (gtag.js) - Google Analytics