在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编码
-
public class EchoDecoder extends ProtocolDecoderAdapter{
-
@Override
-
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
-
throws Exception {
-
//1F1F
-
in.get();
-
in.get();
-
in.get();
-
in.get();
-
-
int len=Integer.parseInt((char)in.get()+"", 10);
-
byte bytes[] = new byte[len];
-
in.get(bytes);
-
-
String recvString = new String(bytes, "UTF-8");
-
-
out.write(recvString);
-
-
//EFEF
-
in.get();
-
in.get();
-
in.get();
-
in.get();
-
}
-
}
-
-
public class EchoEncoder extends ProtocolEncoderAdapter {
-
@Override
-
public void encode(IoSession session, Object message,
-
ProtocolEncoderOutput out) throws Exception {
-
String s = (String)message;
-
byte[] bytes = s.getBytes("UTF-8");
-
-
int l = bytes.length;
-
IoBuffer buf = IoBuffer.allocate(12+l);
-
buf.clear();
-
buf.put((byte)('1'));
-
buf.put((byte)('F'));
-
buf.put((byte)('1'));
-
buf.put((byte)('F'));
-
-
buf.put((byte)(l+30));
-
-
-
buf.put(bytes);
-
-
buf.put((byte)('E'));
-
buf.put((byte)('F'));
-
buf.put((byte)('E'));
-
buf.put((byte)('F'));
-
-
buf.flip(); //转读
-
out.write(buf);
-
out.flush();
-
}
-
}
decoder一定要一次取出IoBuffer里所有数据,否则会一直触发读事件。
阅读(1566) | 评论(0) | 转发(0) |