Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82280
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 340
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-02 20:25
文章分类

全部博文(31)

文章存档

2015年(2)

2014年(29)

我的朋友

分类: Java

2014-09-11 21:13:26

  在MINA中提供了ProtocolEncoder跟ProtocolDecoder两个接口来提供编码跟解码方法。另外提供ProtocolCodecFactory接口来返回这两个接口的实现类。所以在mina中实现编解码功能,必须实现这3个接口。
 虽然真正的编解码算法随应用各部相同,但如何使用这些算法进行数据解析的过程却是相当一致的。所以通过模板设计模式,我们只需要给ProtocolCodecFilter提供具体的ProtocolCodecFactory实现类即可。
 总的来说,在MINA中编解码需要设计到以下几个类:
1. ProtocolEncoder跟ProtocolDecoder两个接口。
2. 
ProtocolEncoderAdapter跟ProtocolDecoderAdapter,这两个跟适配器模式没什么关系,只是个普通的实现了上诉两个对应接口的抽象类而已,ProtocolEncoderAdapter为ProtocolEncoder接口提供了一些方法的默认实现,仅此而已。
3. ProtocolCodecFactory:需要实现的一个接口,用于生成ProtocolEncoder跟ProtocolDecoder两个接口的实现类
4. 
ProtocolCodecFilter:编解码的过滤器,提供了编解码的模板。
5. IoBuffer:NIO中ByteBuffer的简单封装
6. ProtocolDecoderOutput、ProtocolEncoderOutput:将编码的消息返回给下一个过滤器

一.  例子

   实现一个特定格式的Echo,消息格式为:1F1F length string EFEF. length(1个byte)=length(string)。采用utf编码

点击(此处)折叠或打开

  1. public class EchoDecoder extends ProtocolDecoderAdapter{
  2.     @Override
  3.     public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
  4.             throws Exception {
  5.         //1F1F
  6.         in.get();
  7.         in.get();
  8.         in.get();
  9.         in.get();
  10.         
  11.         int len=Integer.parseInt((char)in.get()+"", 10);
  12.         byte bytes[] = new byte[len];
  13.         in.get(bytes);
  14.         
  15.         String recvString = new String(bytes, "UTF-8");
  16.         
  17.         out.write(recvString);
  18.         
  19.         //EFEF
  20.         in.get();
  21.         in.get();
  22.         in.get();
  23.         in.get();
  24.     }    
  25. }

  26. public class EchoEncoder extends ProtocolEncoderAdapter {
  27.     @Override
  28.     public void encode(IoSession session, Object message,
  29.             ProtocolEncoderOutput out) throws Exception {
  30.         String s = (String)message;
  31.         byte[] bytes = s.getBytes("UTF-8");    
  32.         
  33.         int l = bytes.length;
  34.         IoBuffer buf = IoBuffer.allocate(12+l);
  35.         buf.clear();
  36.         buf.put((byte)('1'));
  37.         buf.put((byte)('F'));
  38.         buf.put((byte)('1'));
  39.         buf.put((byte)('F'));
  40.         
  41.         buf.put((byte)(l+30));
  42.         
  43.         
  44.         buf.put(bytes);
  45.         
  46.         buf.put((byte)('E'));
  47.         buf.put((byte)('F'));
  48.         buf.put((byte)('E'));
  49.         buf.put((byte)('F'));
  50.         
  51.         buf.flip(); //转读
  52.         out.write(buf);
  53.         out.flush();
  54.     }
  55. }
  decoder一定要一次取出IoBuffer里所有数据,否则会一直触发读事件。
阅读(1538) | 评论(0) | 转发(0) |
0

上一篇:5.mina概述

下一篇:7.MINA--断包与粘包

给主人留下些什么吧!~~