Filters
IoFilter 是MINA框架中一个核心的部分,如下图,对间于IoService和IoHandle之间,用于过滤所有的I/O事件和请求,其扮演的角色就像J2EE中的Servlet。
MINA提供不少现成的过滤器:
1、LoggingFilter :日志过滤器,用于记录所有的事件和请求日志.
2、ProtocolCodecFilter:规约解析过滤器,用来将所有收到的ByteBuffer内容转换为POJO消息(对象),实现往来报文的编码和解码;
3、CompressionFilter:压缩过滤器;
4、SSLFilter
…
ProtocolCodecFilter
相对比较常用的是ProtocolCodecFilter,下面主要介绍一下ProtocolCodecFilter的使用:
还是以官方帮助文档中例子来说明(http://mina.apache.org/chapter-11-codec-filter.html)
这是一个图片服务器程序,请求图片的下行报文格式:
width: 请求图片的宽度
height: 请求图片的高度
numchars: 生成的字节个数
服务端返回两张图片:
length1: 图片1的大小
image1: 图片1(PNG格式)
length2: 图片2的大小
image2: 图片2(PNG格式)
现在如果想通过MINA框架来实现基于这一简单规约的编解码通信功能,应该如何做呢?
public class ImageServer { public static final int PORT = 33789; public static void main(String[] args) throws IOException { ImageServerIoHandler handler = new ImageServerIoHandler(); NioSocketAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast("protocol", new ProtocolCodecFilter(new ImageCodecFactory(false))); acceptor.setLocalAddress(new InetSocketAddress(PORT)); acceptor.setHandler(handler); acceptor.bind(); System.out.println("server is listenig at port " + PORT); } }
这里先来看和Filter有关的部分:
acceptor.getFilterChain().addLast("protocol", new ProtocolCodecFilter(new ImageCodecFactory(false)));
在acceptor的Filter链中加入我们自己的过滤器,一个ProtocolCodecFilter的实现,这里的ImageCodecFactory又是什么呢?
public class ImageCodecFactory implements ProtocolCodecFactory { private ProtocolEncoder encoder; private ProtocolDecoder decoder; public ImageCodecFactory(boolean client) { if (client) { encoder = new ImageRequestEncoder(); decoder = new ImageResponseDecoder(); } else { encoder = new ImageResponseEncoder(); decoder = new ImageRequestDecoder(); } } public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception { return encoder; } public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception { return decoder; } }
ImageCodecFactory是对接口ProtocolCodecFactory 的实现,是用来构建Filter的。ProtocolCodecFactory 接口只有两个方法:
public interface ProtocolCodecFactory { public ProtocolEncoder getEncoder(IoSession is) throws Exception; public ProtocolDecoder getDecoder(IoSession is) throws Exception; }
没错,这个规约编解码工厂需要装配一个编码器(Encoder)和一个解码器(Decoder):
编码器:
public class ImageRequestEncoder implements ProtocolEncoder { public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { ImageRequest request = (ImageRequest) message; IoBuffer buffer = IoBuffer.allocate(12, false); buffer.putInt(request.getWidth()); buffer.putInt(request.getHeight()); buffer.putInt(request.getNumberOfCharacters()); buffer.flip(); out.write(buffer); } public void dispose(IoSession session) throws Exception { // nothing to dispose } }
解码器:
public class ImageRequestDecoder extends CumulativeProtocolDecoder { protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { if (in.remaining() >= 12) { int width = in.getInt(); int height = in.getInt(); int numberOfCharachters = in.getInt(); ImageRequest request = new ImageRequest(width, height, numberOfCharachters); out.write(request); return true; } else { return false; } } }
这里解码器不是直接从ProtocolDecoder继承的,为什么呢?因为实际中接受的一个数据包并不能保证包含完整的一帧报文,就是所谓的断帧的情况,如果用CumulativeProtocolDecoder,就不需要自己处理这种情况了,MINA框架会将未解码的数据保留,等下一包数据到来后继续尝试解码;
这里编码器的encode和解码器的doDecode方法就是实际用来进行应用层规约编解码的;其中ImageResuest是下行请求规约对应POJO.
整个类的协助关系如下图所示:
Filter过滤器处理完后,就交给Handler,做进一步业务处理;
Response部分的就不多罗嗦了,可以看这里
至此对MINA框架用过的一些东西,从使用指南的角度做了一些总结,还有很多方面还没有用过,先留一个坑,等来日填补吧。MINA框架最吸引我的是这种设计思想,将通信、规约解析、业务处理分离得恰到好处,既不影响性能又方便扩展和替换。下一步希望从源代码的角度,学习一下其内部的实现思想。
相关推荐
### Mina框架研究与实现 #### 引言 在当今高度网络化的世界中,服务器端程序面临着前所未有的挑战,特别是当需要同时处理成百上千的客户端连接时。这不仅要求服务器具备高性能,还必须保证高可用性。Mina框架正是...
JAVA Mina框架是一款高度可扩展、高性能的网络应用开发框架,专为Java平台设计。它提供了丰富的网络通信API,使得开发者能够轻松地构建基于TCP/IP、UDP/IP以及其他协议的服务器和客户端应用程序。Mina框架的核心设计...
Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...
Apache Mina是一个开源项目,它提供了一个高度模块化、高性能的网络通信框架。Mina旨在简化网络应用的开发,支持多种传输协议,如TCP、UDP、HTTP、FTP等。在这个“Mina入门:Mina版之HelloWorld”教程中,我们将探讨...
在本压缩包"apache-mina-2.0.4"中,包含的是Mina框架的源码和jar包,这为开发者深入理解Mina的工作机制以及自定义功能提供了便利。 **Mina框架的核心概念:** 1. **I/O模型**:Mina基于NIO(Non-blocking I/O)...
微信小程序是一种轻量级的应用开发平台,主要针对移动端,它允许开发者通过微信的开发工具创建出能在微信内部...通过深入研究这个Web MINA框架,开发者能够更好地掌握微信小程序的开发技术,提升自己的项目开发能力。
8. **学习与实践**:这个项目作为一个完整的示例,非常适合初学者研究和学习MINA框架。通过运行服务端和客户端,可以观察数据交互的过程,理解MINA如何处理网络事件和数据传输。此外,你还可以尝试修改代码,添加新...
Apache MINA(Multipurpose ...通过研究这些源代码,读者可以更直观地了解MINA框架的使用方法和实现细节。学习这个项目,你可以动手实践MINA的基本用法,理解异步编程模型,以及如何处理网络通信中的各种事件。
**Mina2框架详解与实例教程** Mina2(全称Apache MINA,Multipurpose Infrastructure for Network Applications)是一个高性能、事件驱动的网络应用程序框架,主要应用于开发网络通信应用,如TCP/IP和UDP/IP协议栈...
在深入分析MINA框架源码之前,我们需要理解几个核心概念: 1. **过滤器(Filter)**:MINA采用过滤器链模式处理网络事件,每个过滤器都可以对入站和出站的数据进行处理。过滤器可以用于数据编码、解码、安全处理、...
"mina框架中socket应用的简单小项目,包含了所需jar" 这个标题告诉我们这是一个关于使用Apache MINA框架实现的基于Socket通信的小型项目。MINA是一个为高性能网络应用提供高度抽象的Java NIO框架,它简化了网络编程...
总而言之,`java源码:高性能Java网络框架 MINA.zip`这个压缩包包含的是MINA框架的源代码,对于希望深入研究Java网络编程、提高系统性能的开发者来说是一份宝贵的资源。通过分析和学习MINA的源码,我们可以了解如何...
Apache Mina FTPServer是一个基于Apache Mina框架的轻量级FTP服务器实现,它为开发者提供了构建自定义FTP服务器的能力。这个框架非常适合初学者学习,因为它提供了清晰的结构和丰富的文档,帮助理解网络通信和FTP...
标题"mina高性能Java网络框架 v2.2.1.zip"表明这是Apache MINA框架的一个特定版本——v2.2.1的打包文件,通常包含源代码、文档和其他相关资源。这个版本可能包含了性能优化、bug修复以及新功能的引入,适合用于开发...
标题中的"MINA-2.0.0-M3"指的是MINA框架的第2.0.0-M3版本。这个版本是一个里程碑版本(M3,Milestones),通常在正式版本发布之前,用于收集用户反馈和进行测试。 MINA的核心设计目标是提供一个灵活、可扩展的网络...
MINA(Multipurpose Infrastructure for Network Applications)是Apache软件基金会的一个开源项目,主要为构建高性能、跨平台的网络应用程序提供框架。MINA1.7版本是一个成熟的版本,它提供了丰富的网络通信API,...
**标题与描述解析** ...总的来说,这个压缩包为Java开发者提供了一个深入理解并实践MINA框架的机会,通过研究源码和示例,可以提升对网络编程和异步事件驱动模型的理解,以及如何利用MINA构建高性能的网络应用。
在压缩包文件"apache-mina"中,可能包含了MINA框架的源码、示例代码、配置文件以及其他相关资源,这些都是学习和研究MINA的好材料。开发者可以通过阅读这些代码,进一步了解MINA在实际应用中的具体实现方式。
《MINA框架自定义解编码器的深度解析与实践》 MINA(Java Multithreaded Network Application Framework)是一个开源的、跨平台的Java网络应用框架,它为开发者提供了高度可扩展性和高性能的网络通信能力。MINA的...