`

深入理解Apache Mina (4)---- IoFilter和IoHandler的区别和联系

阅读更多

在《与IoFilter相关的几个类》和《与IoHandler相关的几个类》两篇文档中我们了解了IoFilter和IoHandler的基本用法,以及其相关类的作用和用途。在本文中主要探讨IoFilter和IoHandler的主要区别和联系。

 

在上面的两篇文档中都提到了IoFilter和IoHandler都是对服务器或客户端(IoAcceptor/IoConnector)接收到的数据进行处理。在Mina的官方文档《The high-performance protocol construction toolkit》给出了IoFilter和IoHandler在Mina数据传输中的执行顺序,如下图:

 

上图显示了IoService进行数据读写时,各主要组件的执行顺序:
(1)IoService读取数据时个组件的执行顺序是:IoProcessor-->IoFilter-->IoHandler。
(2)IoService发送数据时的执行数顺序:IoHandler-->IoFilter-->IoProcessor。

 

IoProcessor是一个处理线程,它的主要作用是根据当前连接的状态的变化(创建会话、开启会话、接收数据、发送数据、发生异常等等),来将数据或事件通知到IoFilter,当IoFilter的相应的方法接收到该状态的变化信息是会对接收到的数据进行处理,处理完毕后会将该事件转发到IoHandler中,有IoHandler完成最终的处理。在这里IoProcessor的主要功能是创建资源(创建/分配线程给IoFilter)和数据转发(转发到IoFilter),IoFilter对数据进行基本的分类(如编解码),IoHandler则负责具体的逻辑实现。也就是说IoFilter对接收到的数据包的具体内容不做处理,而是有IoHandler来对所接收到的数据包进行处理,根据数据包的内容向客户端返回响应的信息。

 

我们以《与IoHandler相关的几个类》中KFC售货机的例子来做一个具体的解释,在该例子中,客户端需要想服务器发送查询价格的请求,服务器根据接收到的请求查询物品的价格,然后将该物品的价格返回到客户端。客户端在向服务器发送数据前会有IoFilterr将发送的信息序列化为二进制数据,然后有IoProcess发送出去,简化如下:


       IoHandler发送客户端数据-->IoFilter进行序列化-->IoProcessor

上面是数据的发送过程,当服务器接收到客户端的的请求数据后,先有IoProcessor将该数据转发到IoFilter,IoFilter将对象进行反序列化,反序列化的结果完成后将数据转发到IoHandler中,过程简化如下:


 IoProcessor接收客户度端的数据-->IoFilter进行反序列化-->IoHandler根据请求查询价格这样一个完整的数据请求的过程就完成了。

 

上面简单介绍了IoFilter和IoHandler在Mina中的作用,前者是数据的转换层,后者是业务层。但是两者在很多地方都有相似之处,为了将两者的区别做更详细的讨论,先给出两者的结构图:

 

图中的IoFilter比IoHandler中多出的一个最重要的方法就是filterWriter(),该方法会在程序调用session.write()的时候触发,该方法的重要之处就在于它表明了IoFilter和IoHandler的重要区别,即进行IoFilter是数据的收发层,也可以说是一个数据的收发器,而IoHandler则是逻辑层,并不负责数据的收发,如果把IoProcessor说成是底层的数据收发层,则IoFilter则是一个上层的数据收发层。关于IoFilter中on*()的方法的使用和作用请参考帮助文档,这里不再给出具体的解释。

 

到此我们就可以明白了IoFilter是一个数据收发和转化的装置,而IoHandler则是一个单一的业务处理装置,你的所有业务逻辑都应该写在这个类中。如果没有在IoService中配置IoFilter,那么在IoHandler中接收到的数据是一个ByteBuffer,你需要在你的IoHandler(业务层)中完成数据的转化,但是这样就破坏了Mina中各个组件层的关系,这样你的程序结构就不在清晰,因此建议在使用Mina时将数据的转化(即二进制与对象之间的转换放在IoFilter层来处理)。在Mina中必须要配置IoHandler,因为Mina中提供的IoService中的bind方法必须要有一个IoHandler,因此IoHandler不能省略。

 

到这里对于IoFilter和IoHandler的内容已经讲述完毕,下面的内容是对我在开发中遇到的一些问题的一些总结,顺便也给自己以前的问题写出答案:
(1)IoHandler和IoHandlerCommand的区别和联系。
   IoHandler和IoHandlerCommand是两个接口,在开发中经常遇到的他们两个现类分别是IoHandlerAdpater和IoHandlerChain,IoHandlerAdpater的子类ChainedIoHandler和IoHandlerChain结合使用可以实现多个逻辑功能,IoHandlerChain代表IoHandlerCommand)是业务逻辑的处理单元,而ChainedIoHandler(代表Iohandler)则是处理这些逻辑单元的组件。因此它们的区别是:IoHandler是刀俎,而IoHandlerCommand则是鱼肉。他们的一般用法如下:  

  IoHandlerChain chain = new IoHandlerChain();// 创建逻辑处理组件
  chain.addLast("first", new FistCommand);// 添加逻辑组件单元一
  chain.addLast("second", new SecondCommand);// 逻辑组件单元二
  ChainedIoHandler chained = new ChainedIoHandler(chain);// 创建逻辑组件执行模块
  chained.messageReceived(session, message);// 当messageReceived触发该事件 

 

(2)IoFilter和IoHandler可以同时使用吗?
   IoFilter和IoHandler由于分工不同,因此他们需要同时使用,但是这不是绝对的,在Mina
   的IoService中可以不配置IoFilter,但是必须配置IoHandler。但是,这不是提倡的方式,
   因为这破坏的mina的分层结构,因此建议在使用Mina的时候同时使用IoFilter和
   IoHandler。

(3)IoFilter和IoHandlerCommand/IoHandler的区别和联系。
   这个问题的答案请参考问题(1)和(2)给出的解释。

(4)IoHandlerAdpater和IoFilterAdpater的区别和联系。
   IoHandlerAdpater和IoFilterAdpater一个是业务逻辑层的监听器,一个数据传输层的监
   听器,他们的区别就是IoHandler和IoFilter的区别,这个在上面已经讨论清楚了,不在
   详细说明。

(5)IoFilterChainBuilder和ChainedIoHandler的区别和联系。

     关于这个问题的讨论会在后续的文档中给出。

 

分享到:
评论
2 楼 east_java 2009-09-27  
你好,我在看源码的时候没有看到filter调用handler的方法。
请问他们的调用关系在哪儿体现的?
1 楼 ChinaEstone 2009-07-29  
附件中有本文的完整内容,欢迎下载!

相关推荐

    关于apache Mina Server

    深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和联系 深入理解Apache_Mina_(5)----_配置Mina的线程模型 深入理解Apache_Mina_(6)----_Java_Nio_ByteBuffer与Mina_ByteBuffer的区别(类图) 相信你们也愿意去...

    apache-mina-2.0.4-bin

    1. **mina-core**:这是MINA框架的核心模块,包含所有基本的网络I/O抽象和工具类,如IoSession(表示一个网络连接)、IoFilter(用于数据过滤和处理)、IoAcceptor(监听并接受连接)和IoHandler(处理网络事件)。...

    apache-mina-2.1.3所有jar和源文件.7z

    5. **Source Code**:源代码可以帮助开发者深入理解MINA的工作原理,对其进行调试或扩展,同时也方便学习MINA的优秀设计和编程实践。 使用这个压缩包,开发者可以直接将MINA库引入到项目中,利用其强大的功能进行...

    apache-mina-2.0.21-src.zip

    在“apache-mina-2.0.21-src.zip”这个压缩包中,包含了Apache Mina 2.0.21的源代码,这为我们提供了深入理解其内部工作原理的机会。 Apache Mina的核心特性包括: 1. **异步通信**:Mina基于Java NIO(非阻塞I/O...

    深入理解Apache Mina

    本资料集合对Apache Mina进行了深入探讨,涵盖了Mina的关键组件和概念,包括IoFilter、IoHandler、ByteBuffer以及线程模型等。 1. **IoFilter与IoHandler**: IoFilter是Mina中的过滤器机制,它允许在数据传输过程...

    深入理解Apache_Mina

    Apache Mina框架包括了几个核心组件,如IoAcceptor、IoHandler、IoSession和IoFilter。其中IoAcceptor负责监听端口并接受新的连接请求,IoHandler则是业务逻辑处理的核心,IoSession管理单个网络连接的生命周期,而...

    Apache-Mina-Server-2.0中文参考手册V1.0.docx

    为了充分理解和有效地使用Apache Mina Server 2.0,开发者应具备以下基础知识: - **JAVA IO**:理解基本的输入输出流,包括字节流和字符流。 - **JAVA NIO**:了解非阻塞I/O的概念,包括选择器(Selectors)和通道...

    mina-core-2.0.0-RC1

    MINA的核心类如IoSession、IoHandler和IoFilter链都是在这个库中定义的。通过这些抽象,开发者可以专注于业务逻辑,而不是底层的网络细节。 2. **mina-core-2.0.0-RC1-sources.jar**:这个文件包含了mina-core的源...

    mina 2.0.0-RC1 开发包

    这个库包括了MINA的IoSession、IoHandler、IoFilter等关键组件,它们是构建MINA应用的基础。 `slf4j-api-1.5.6.jar`是Simple Logging Facade for Java的API,是一个用于日志记录的抽象层。SLF4J允许开发者在运行时...

    apache mina

    - Mina4_IoFilter和IoHandler的区别和联系.pdf将对比分析两者的关系和用法。 - Mina5_配置Mina的线程模型.pdf将讲解如何定制MINA的线程池配置。 通过对这些文档的学习,你可以全面掌握Apache MINA框架,从基础到...

    Apache Mina Server 2.0 抢鲜体验

    7. **源码分析**:由于标签中提到了“源码”,因此,对于有志于深入理解Mina工作原理的开发者来说,阅读和分析Apache Mina的源码可以帮助他们更好地优化自己的网络应用程序,提高性能和稳定性。 8. **性能优化**:...

    mina2.0.7所有jar

    1. **mina-core-2.0.7.jar**:这是MINA的核心库,包含了网络通信的基本组件和API,如IoSession、IoFilter、IoHandler等,它们用于处理网络连接、数据传输以及过滤器链的管理。 2. **mina-example-2.0.7.jar**:这个...

    mina源码+例子mina-2.0.0-M6.zip

    - **src** 目录:包含了MINA框架的源代码,通过阅读源代码,你可以深入理解MINA的设计思想和实现细节。 - **examples** 目录:包含了一系列示例项目,这些项目展示了如何使用MINA来创建不同类型的网络服务,如简单的...

    Apache_Mina_Server_ 深入教程V1.0

    ### Apache Mina Server深入教程V1.0 #### 一、Apache Mina Server简介 Apache Mina Server是一款高性能且易于使用的网络通信应用框架,主要基于TCP/IP和UDP/IP协议栈进行设计,同时也支持其他类型的通信服务,...

Global site tag (gtag.js) - Google Analytics