即时通讯开发apachemina框架之iofilter详解

wecloud1314 wecloud1314     2022-12-04     429

关键词:

见名知义,IoFilter应该是一个过滤器,没错,它确实是一个过滤器。它和Servlet中的过滤器类似,主要用于拦截和过滤I/O操作中的各种信息。

 

在Mina的官方文档中已经提到了IoFilter的作用:

    (1)记录事件的日志(这个在本文中关于LoggingFilter的讲述中会提到)

    (2)测量系统性能

    (3)信息验证

    (4)过载控制

    (5)信息的转换(例如:编码和解码,这个会在关于ProtocolCodecFilter的讲述中会提到)

    (6)和其他更多的信息

先看看几个问题,然后沿着问题的思路一个一个的对IoFilter进行讲解:

    (1)什么时候需要用到IoFilter,如果在自己的应用中不添加过滤器可以吗?

    (2)如果在IoService中添加多个过滤器可以吗?若可以,如何进行添加,这多个过滤 器是如何工作的?

    (3)Mina中提供了协议编、解码器,IoFilter也可以实现IO数据的编解码功能,在实际 的使用中如何选择?

先看看 LoggingFilter

为了对IoFilter提供的方法有一个具体的了解,先对Mina自身提供的一个最简单的过滤器进行一些讲解----LoggingFilter。

首先还是看一下LoggingFilter中提供的几个方法。列举如下(方法中的参数就不再给出,完整方法的实现请参考附件中LoggingFilter的源码):

    (1)sessionCreated()
    (2)sessionOpened()
    (3)sessionClosed()
    (4)sessionIdle()
    (5)exceptionCaught()
    (6)messageReceived()
    (7)messageSent()
    (8)filterWrite()
    (9)filterClose()


这几个方法都由相应会话(或者说是连接的状态,读、写、空闲、连接的开闭等)的状态的改变来触发的。当一个会话开启时,LoggingFilter捕获到会话开启的事件,会触发sessionCreated()方法,记录该会话开启的日志信息。同样当一个会话发送数据时,Logging捕获到会话发送消息的事件会记录消息发送的日志信息。这里只是给出messageReceived()的完成方法的实现,其他方法的完整实现请参考附件中LoggingFilter的源码。

LoggingFilter继承与IoFilterAdpater,IoFilterAdpater是IoFilter的一个实现类,该类只是提供了IoFilter方法的简单实现----将传递到各方法中的消息转发到下一个过滤器中。你可以根据自己的需求继承IoFilterAdpater,并重写相关的方法。LoggingFilter就是重写了上面提到的几个方法,用于记录当前的会话各种操作的日志信息。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

 

IoFilter讲解

通过上面的例子,我们可以大体的了解了IoFilter的基本功能:根据当前会话状态,来捕获和处理当前会话中所传递的消息。

我们可以清晰的看到IoFilter是一个接口,它有两个具体的实现类: IoFilterAdpater:该类提供了IoFilter所有方法的方法体,但是没有任何逻辑处理,你可以根据你具体的需求继承该类,并重写相关的方法。IoFilterAdpater是在过滤器中使用的较多的一个类。

ReferenceCountingIoFilter:该类封装IoFilter的实例,它使用监视使用该IoFilter的对象的数量,当没有任何对象使用该IoFilter时,该类会销毁该IoFilter。

IoFilterAdpater有三个子类,它们的作用分别如下: LoggingFilter:日志工具,该类处理记录IoFilter每个状态触发时的日志信息外不对数据做任何处理。它实现了IoFilter接口的所有方法。你可以通过阅读该类的源码学习如何实现你自己的IoFilter。

ExcuterFilter:这个Mina自身提供的一个线程池,在Mina中你可以使用这个类配置你自己的线程池,由于创建和销毁一个线程,需要耗费很多资源,特别是在高性能的程序中这点尤其重要,因此在你的程序中配置一个线程池是很重要的。它有助于你提高你的应用程序的性能。

ProtocolFilter:该类是Mina提供的一个协议编解码器,在socket通信中最重要的就是协议的编码和解码工作,Mina提供了几个默认的编解码器的实现,在下面的例子中使用了ObjectSerializationCodecFactory,这是Mina提供的一个Java对象的序列化和反序列化方法。使用这个编解码器,你可以在你的Java客户端和服务器之间传递任何类型的Java对象。但是对于不同的平台之间的数据传递需要自己定义编解码器。

IoFilter在MINA中的真正作用

在上面的例子中我们清楚了整个IoFilter或者是IoFilter的工作流程,那么IoFilter在Mina中的作用如何?所有的数据在发送到Mina程序中时,数据都是先通过IoFilter,经过处理后再转发到业务层。这里IoFilter就起到了一个承上启下的作用。

到这里我们就可以回答本文开始提到的问题了:

    (1)什么时候需要用到IoFilter,如果在自己的应用中不添加过滤器可以吗?
      在你自己的程序中可以添加过滤器,也可以不添加,但是在数据发送之前,所发送的数据必须转换成二进制数据,这个可以有IoFilter完成,也可以由ProtocolCodecFilter完成(关于这个问题会在后面的文章中详细讲述),否则Mina会抛出Write requests must be transformed to class org.apache.mina.common.ByteBuffer:异常。这是因为网络中传输的数据只能是二进制数据。因此无论添加不添加过滤器,都必须将要发送的数据转换成二进制数据。
    (2)如果在IoService中添加多个过滤器可以吗?若可以,如何进行添加,这多个过滤 器是如何工作的?
      在IoService中可以添加多个过滤器,这个在上面的程序中已经给处理,添加的方式也很简单,通过程序一目了然。
    (3)Mina中提供了协议编、解码器,IoFilter也可以实现IO数据的编解码功能,在实际的使用中如何选择?
      Mina的编解码器在Mina的使用中是最关键的一个问题,特别是在不同语言之间进行通信的时候,比如Java和C/C++等,由于Mina自身没有提供这些编解码器,所以需要自己来实现。Mina提供了一个Decoder/Encoder,你可以实现两个类来完成不同平之间的通信。

即时通讯开发之mina2线程原理

读入数据逻辑:IO读入(IoProcessor)---日志记录、解码、threadPool(IoFilter)---业务逻辑处理(IoHandler)写出数据逻辑:业务逻辑处理(IoHandler)---日志记录、编码、threadPool(Io 查看详情

即时通讯开发之mina2线程原理

读入数据逻辑:IO读入(IoProcessor)---日志记录、解码、threadPool(IoFilter)---业务逻辑处理(IoHandler)写出数据逻辑:业务逻辑处理(IoHandler)---日志记录、编码、threadPool(IoFilter)--... 查看详情

即时通讯开发之mina2线程原理

读入数据逻辑:IO读入(IoProcessor)---日志记录、解码、threadPool(IoFilter)---业务逻辑处理(IoHandler)写出数据逻辑:业务逻辑处理(IoHandler)---日志记录、编码、threadPool(IoFilter)--... 查看详情

即时通讯开发框架之nio框架中netty的高性能之道

Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机... 查看详情

详解即时通讯开发框架netty4.x之channel和pipeline

Channel概念与java.nio.channel概念一致,用以连接IO设备(socket、文件等)的纽带。Netty4.x之后的Channel变化较大,官方的唬人的说法是无法通过简单的关键字替换进行迁移。用得较多应该是:ChannelHandler接口重新设... 查看详情

详解im即时通讯开发框架netty4.x之bytebuf

程序员喜欢说一句话:「不要重复造轮子」,但是程序员又不太会践行这句话。这倒也不是坏事,程序员一般而言看他人代码都不会太爽,这也可能是导致程序员的世界有各式各样的轮子的原因吧。 ByteBuf与JavaNIO... 查看详情

即时通讯开发之netty的退出机制和原理

“退出”是每个程序的必备功能,因为太平常,多数程序员都对这不以为然。但在大型分布式应用中,因各模块、服务等都是分布式部署和协作,这种RPC式的场景下,如何让某个模块或服务优雅地“退出”ÿ... 查看详情

即时通讯开发之websocket与socket的关系

对于很多初次接触Web端即时通讯技术的人来说,WebSocket是个很新的概念,但无疑它也是当前Web端即时通讯技术中最热门的关键词。随便点开一篇文章,只要说打算开发Web端即时通讯类应用,老司机们无一例外推荐... 查看详情

android性能优化之即时通讯优化

面试的时候问到了即时通讯系统,我选择的是基于xmpp进行即时通讯的框架,整个系统是基于openfire去实现的,但是怎么说呢,毕竟这个开源项目来说只是提供一个框架,其实是需要我们对他进行优化和改善的&#... 查看详情

im即时通讯开发之websocket断网重连更快的方法

在一个完善的即时通讯IM应用中,WebSocket是极其关键的一环,它为基于Web的即时通讯应用提供了一种全双工的通信机制。但为了提升IM等实际应用场景下的消息即时性和可靠性,我们需要克服WebSocket及其底层依赖的TCP... 查看详情

im即时通讯开发应用保活之进程防杀

在Android4.4及以后的系统中,应用能否常驻内存,一直以来都是相当头疼的事情,尤其移动端IM、消息推送这类应用,为了保证“全时在线”的概念,真是费尽了心思。虽然APP常驻内存对于用户来说比较”恶心”,但是在诸如IM和... 查看详情

socket开发框架之框架设计及分析

...水利、压力监测方面的设备数据采集等,以及常见的IM(即时通讯,如腾讯QQ、阿里旺旺等)的客户端,都可以采用Socket框架进行相关的数据采集和信息通讯用途的,Socket应用可以做为APP应用、Web应用和Winform应 查看详情

将在microsoft bot框架中开发的chatbot部署到Jabber即时通讯工具中

】将在microsoftbot框架中开发的chatbot部署到Jabber即时通讯工具中【英文标题】:DeployingchatbotdevelopedinmicrosoftbotframeworktoJabberinstantmessagingtool【发布时间】:2019-01-0809:37:16【问题描述】:我们在microsoftbot框架(C#SDKV3)中开发了功能齐全... 查看详情

即时通讯移动端开发之网络连接优化

技术背景连接优化需要解决两个核心问题:1)连接建立耗时较长,导致请求的总时长变长,进而影响用户体验;2)在多变的网络环境下,连接建立的过程可能会失败,导致成功率下降,进而影... 查看详情

即时通讯开发之javanio入门知识分享

JavaNIO是Java1.4版加入的新特性,虽然Java技术日新月异,但历经10年,NIO依然为Java技术领域里最为重要的基础技术栈,而且依据现实的应用趋势,在可以预见的未来,它仍将继续在Java技术领域占据重要位置... 查看详情

im即时通讯开发之android内存泄漏监控

对于Android平台的应用程序来说,内存优化一直是个热门话题,与传统PC应用程序不同,Android上的应用一旦出现各种异常时系统默认会以最严厉的“崩溃”方式反馈给用户,如果处理不当,将严重影响用户体验... 查看详情

即时通讯开发之netty入门长文:基本介绍环境搭建

在了解Netty之前,我们非常有必要简要了解一下Java网络编程模型的基本常识,具体说也就是BIO、NIO和AIO这3个技术概念。BIO、NIO和AIO这三个概念分别对应三种通讯模型:阻塞、非阻塞、非阻塞异步,具体这里就不详... 查看详情

即时通讯开发之tcp/ip基本概念

在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。计算机使用者意识... 查看详情