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框架研究与实现
资源包括: MINA笔记.docx MINA2官方教程翻译.pdf Mina2.0快速入门与源码剖析...MINA网络框架和RMI的对比研究.pdf 基于3G网络的移动流媒体服务器的设计与实现.pdf 高性能通信框架及智能主站技术研究.nh MINA类图.doc 等
这是我学习apache mina框架中研究ssl过滤器u做的一个测试的例子。希望对于刚刚学习mina框架的朋友有所帮助。如果有什么疑问可以发送到我的emai:pengli.bj@163.com与我联系
为什么不是 为什么不是 MinaMina Mina? 1、都是 Trustin LeeTrustin LeeTrustin Lee Trustin Lee Trustin LeeTrustin LeeTrustin LeeTrustin LeeTrustin Lee的作品, 的作品, 的作品, NettyNettyNetty 更晚; 更...
基于MINA框架和JMS消息服务设计出家庭物联网的消息管理机制, 根据HBase数据库设计家庭物联网的数据存储模型以实现数据存储分区, 采用MapReduce技术实现家庭物联网的数据分析及数据挖掘, 从而构建出完备的家庭物联网...
介绍了XMPP协议、Openfire开源项目以及MINA框架.研究Openfire3 .3 .3中如何使用MI-NA框架部分,对服务器端监听连接、XMPP协议编解码类、业务实现逻辑类、简单的通信统计实现、Openfire的启动等进行分析.结果表明,MINA...
2.3 微信小程序的 MINA 框架 2.4 微信小程序云开发 2.5 微信 Web 开发者工具 2.6 本章小结 第三章 系统需求分析 3.1 系统用户定义 3.2 学生功能 3.2.1 学生注册功能 3.2.2 学生登陆功能 3.2.3 学生个人信息查改功能 ...
使用微信开发者工具进行开发,采用MINA框架,运用WXML、WXSS设计前端页面,MySQL来存储数据,能够使微信小程序前端和服务器后端进行数据交互和通信从而实现酒店管理系统。 (1)系统功能模块设计 本系统分为前台系统...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
小程序 MINA SpringBoot 在线教育 本文即基于微信小程序平台,开发设计一款基于Java的二手书交易平台,并提供基于B/S机构的后台管理系统。 小程序——主页模块 首页模块可以浏览平台上已发布的待售书籍名称、简介...
本文主要研究基于微信小程序和 TinkPHP 5 框架设计与开发的助农系统。 该系统是在互联网飞速发展和电商物流快速发展的背景下应运而生的,为解决 农户销售农产品难和消费者购买绿色无害农场品难的问题而设计的。 对于...
apache 非阻塞通信框架,非常好,但有些地方比较难,至今没研究明白。
客户端使用微信团队开发的MINA逻辑框架;云服务端使用腾讯云开发的wafer-2后端开发框架;服务端与mysql数据库交互使用knex.js连接。本系统建立的学生考勤管理机制,为教师及时反馈学生到课率,极大地改善老师的点名...
小程序 MINA SpringBoot 在线教育 本文即基于微信小程序平台,开发设计一款基于Java的二手书交易平台,并提供基于B/S机构的后台管理系统。 小程序——主页模块 首页模块可以浏览平台上已发布的待售书籍名称、简介...