Mina框架研究(3)

Filters

IoFilter 是MINA框架中一个核心的部分,如下图,对间于IoService和IoHandle之间,用于过滤所有的I/O事件和请求,其扮演的角色就像J2EE中的Servlet。

MINA提供不少现成的过滤器:

1、LoggingFilter :日志过滤器,用于记录所有的事件和请求日志.

2、ProtocolCodecFilter:规约解析过滤器,用来将所有收到的ByteBuffer内容转换为POJO消息(对象),实现往来报文的编码和解码;

3、CompressionFilter:压缩过滤器;

4、SSLFilter

ProtocolCodecFilter

相对比较常用的是ProtocolCodecFilter,下面主要介绍一下ProtocolCodecFilter的使用:

还是以官方帮助文档中例子来说明()

这是一个图片服务器程序,请求图片的下行报文格式:

width: 请求图片的宽度 height: 请求图片的高度 numchars: 生成的字节个数

服务端返回两张图片:

length1: 图片1的大小 image1: 图片1(PNG格式) length2: 图片2的大小

image2: 图片2(PNG格式)

现在如果想通过MINA框架来实现基于这一简单规约的编解码通信功能,应该如何做呢?

ImageServer {PORT = 33789; 3: main(String[] args) throws IOException { 5:ImageServerIoHandler handler = new ImageServerIoHandler(); 6:NioSocketAcceptor acceptor = new NioSocketAcceptor(); 7:acceptor.getFilterChain().addLast(“protocol”, new ProtocolCodecFilter(new ImageCodecFactory(false))); 8:acceptor.setLocalAddress(new InetSocketAddress(PORT)); 9:acceptor.setHandler(handler); 10:acceptor.bind(); 11:System.out.println(“server is listenig at port ” + PORT); 12:} 13: }

这里先来看和Filter有关的部分:

acceptor.getFilterChain().addLast(“protocol”, new ProtocolCodecFilter(new ImageCodecFactory(false)));在acceptor的Filter链中加入我们自己的过滤器,一个ProtocolCodecFilter的实现,香港空间,这里的ImageCodecFactory又是什么呢?

ImageCodecFactory implements ProtocolCodecFactory { 2:private ProtocolEncoder encoder; 3:private ProtocolDecoder decoder; 4: 5:public ImageCodecFactory(boolean client) { 6:if (client) { 7:encoder = new ImageRequestEncoder(); 8:decoder = new ImageResponseDecoder(); 9:} else { 10:encoder = new ImageResponseEncoder(); 11:decoder = new ImageRequestDecoder(); 12:} 13:} 14: 15:public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception { 16:return encoder; 17:} 18: 19:public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception { 20:return decoder; 21:} 22: }

ImageCodecFactory是对接口ProtocolCodecFactory 的实现,是用来构建Filter的。ProtocolCodecFactory 接口只有两个方法:

ProtocolCodecFactory { 2: 3:public ProtocolEncoder getEncoder(IoSession is) throws Exception; 4: 5:public ProtocolDecoder getDecoder(IoSession is) throws Exception; 6: } 7:

没错,这个规约编解码工厂需要装配一个编码器(Encoder)和一个解码器(Decoder):

编码器:

ImageRequestEncoder implements ProtocolEncoder { 2: encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { 4:ImageRequest request = (ImageRequest) message; 5:IoBuffer buffer = IoBuffer.allocate(12, false); 6:buffer.putInt(request.getWidth()); 7:buffer.putInt(request.getHeight()); 8:buffer.putInt(request.getNumberOfCharacters()); 9:buffer.flip(); 10:out.write(buffer); 11:} 12: dispose(IoSession session) throws Exception { 14:// nothing to dispose 15:} 16: }

解码器:

还深深埋在心底,要除去,怕是不能活命。

Mina框架研究(3)

相关文章:

你感兴趣的文章:

标签云: