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(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用Java语言编写。MINA旨在简化网络编程,特别是TCP/IP和UDP/IP协议的应用开发,如HTTP、...
#### 一、Apache Mina简介 Apache Mina是一个高度可扩展且功能强大的网络通信框架,它简化了基于TCP/IP和UDP/IP协议的应用程序开发过程。通过Mina,开发者能够更高效地构建出高性能的服务端和客户端应用程序。 **...
1. Mina简介 Mina(Java NIO-based Network Application Framework)是基于Java NIO(非阻塞I/O)的网络应用程序框架。它提供了一个事件驱动、异步处理模型,能够处理大量的并发连接,特别适合于高性能、高并发的...
**Mina简介** Mina是Apache旗下的一款强大的网络应用框架,专为高性能和高可扩展性网络应用设计,其核心是利用Java NIO技术提供事件驱动的异步API,适用于多种传输协议如TCP/IP和UDP/IP。Mina可视为: - NIO框架 - ...
**一、Mina简介** Mina框架支持多种协议,如TCP/IP、UDP/IP、SSL/TLS等,因此常被用于构建服务器端应用,如FTP、SMTP、HTTP服务器等。它基于Java NIO(Non-blocking I/O)API,提供了一种面向服务的、事件驱动的架构...
Mina简介** Mina全称为"Minimum Asynchronous Network Application",它提供了基于事件驱动和非阻塞I/O模型的网络通信API,适用于TCP、UDP等多种协议。Mina的设计目标是简化网络编程,让开发者可以专注于业务逻辑...
#### 一、Mina简介 Apache Mina Server是一款高性能、易于使用的网络通信框架,主要用于构建基于TCP/IP或UDP/IP协议的应用程序。该框架的核心优势在于其能够帮助开发者快速构建高效且可扩展的网络服务。Mina支持事件...
**MINA 简介** Apache MINA 提供了一套高级抽象层,使得开发者能够专注于业务逻辑,而不是底层网络通信的细节。它简化了网络编程,特别是对于需要处理大量并发连接的应用来说。MINA 提供了事件驱动的模型,通过 I/O ...
1. **Mina简介**:首先,会介绍Mina的基本概念,包括其设计目标、主要功能和它在开发网络应用中的角色。 2. **环境准备**:设置开发环境,包括添加Mina的依赖到项目中,这可能涉及到Maven或Gradle的配置。 3. **...
#### 一、Apache Mina简介 Apache Mina 是一个高度可扩展的网络应用程序框架,用于简化TCP/IP或UDP/IP网络应用的开发。它提供了丰富的功能,如事件驱动的I/O处理、多种传输协议支持以及广泛的过滤器机制等,这些都...
#### 一、Mina简介及下载配置流程 **Mina**,全称**Multipurpose Infrastructure Networked Applications**,是Apache基金会开发的一个高性能网络应用框架,旨在帮助开发者构建高性能和高扩展性的网络应用程序。其...
#### MINA简介 MINA是由Trustin Lee设计并维护的一款基于Java NIO的通信框架。NIO(Non-blocking I/O,非阻塞I/O)自Java 1.4版本引入以来,为Java开发者提供了更为高效的I/O操作机制。相较于传统的阻塞I/O模型,...
1. **Spring Mina简介** Spring Mina是Spring框架的一个扩展,它提供了对Apache Mina库的高级封装。Apache Mina是一个事件驱动的网络应用框架,支持多种协议如TCP/IP、UDP、HTTP、FTP等,广泛应用于IoT、游戏服务器...
2. **Apache Mina简介** Mina是Apache基金会的一个项目,它为开发高性能和高可用性的网络应用提供了基础框架。Mina支持多种I/O模型,如NIO(非阻塞I/O)和BIO(阻塞I/O),并且提供了事件驱动的编程模型,使得处理...
#### 一、Mina简介 **Apache Mina** 是一款高性能且易于使用的网络应用程序框架,其主要目的是帮助开发者轻松构建高性能和高可靠性的网络应用。该框架的核心优势在于其采用了事件驱动的异步API,这使得它能够有效地...
一、Mina简介 Apache Mina(Model-View-Controller for Network Applications)是一个网络通信框架,它简化了开发高性能、高可用性的网络服务的过程。Mina提供了异步事件驱动的网络应用程序架构,适用于TCP/IP和UDP...
#### 一、Mina简介与应用场景 ##### Mina概述 Mina(**Mini Network Application**)是一个简洁且易于使用的Java网络应用开发框架,主要针对TCP/IP通信进行优化设计。它能够帮助开发者快速构建网络应用程序,支持...
1. **Mina简介** Mina是基于Java的网络应用框架,支持TCP、UDP等多种传输协议。它为开发者提供了事件驱动、非阻塞I/O的网络编程模型,提高了服务器端的并发处理能力。Mina广泛应用于各种网络服务,如FTP、SMTP、...