【MinaFile】【三】写自定义编码解码
来源:互联网 发布:局域网域名 编辑:程序博客网 时间:2024/06/05 16:47
一、添加常量类Constants
/** * 消息自身字节常量类 * @author king_fu * */public class Constants { public static final int TYPE_LEN = 2; public static final int SEQUENCE_LEN = 4; public static final int HEADER_LEN = TYPE_LEN + SEQUENCE_LEN; public static final int BODY_LEN = 12; public static final int RESULT = 0; public static final int ADD = 1; public static final int RESULT_CODE_LEN = 2; public static final int RESULT_VALUE_LEN = 4; public static final int ADD_BODY_LEN = 4; public static final int RESULT_OK = 0; public static final int RESULT_ERROR = 1; private Constants() { }}
下面用了设计模式中的模版方法。
二、添加抽象父类解码器AbstractMessageDecoder
/** * 父类解码 * @author king_fu * */public abstract class AbstractMessageDecoder implements MessageDecoder { private final int type; private int sequence; private boolean readHeader; protected AbstractMessageDecoder(int type) { this.type = type; } public MessageDecoderResult decodable(IoSession session, IoBuffer in) { // 判断是否符合最小的头长度。一个short+一个int类型。 /** * // 编码头 * buf.putShort((short) type); * buf.putInt(message.getSequence()); */ if (in.remaining() < Constants.HEADER_LEN) { return MessageDecoderResult.NEED_DATA; } if (type == in.getShort()) { return MessageDecoderResult.OK; } return MessageDecoderResult.NOT_OK; } public MessageDecoderResult decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { if (!readHeader) { in.getShort(); sequence = in.getInt(); readHeader = true; } AbstractMessage m = decodeBody(session, in); if (m == null) { return MessageDecoderResult.NEED_DATA; } else { readHeader = false; } m.setSequence(sequence); out.write(m); return MessageDecoderResult.OK; } /** * 模版方法 * @param session 当前的session * @param in 输入流 * @return如果对象没有读完返回null */ protected abstract AbstractMessage decodeBody(IoSession session, IoBuffer in);}
三、添加抽象父类编码器AbstractMessageDecoder
/** * 父类编码 * @author king_fu * * @param <T> */public abstract class AbstractMessageEncoder<T extends AbstractMessage> implements MessageEncoder<T> { private final int type; protected AbstractMessageEncoder(int type) { this.type = type; } public void encode(IoSession session, T message, ProtocolEncoderOutput out) throws Exception { IoBuffer buf = IoBuffer.allocate(16); buf.setAutoExpand(true); // 编码头 buf.putShort((short) type); buf.putInt(message.getSequence()); // 编码体 encodeBody(session, message, buf); buf.flip(); out.write(buf); } protected abstract void encodeBody(IoSession session, T message, IoBuffer out);}
四、添加子类解码器MessageDecoder
/** * 消息解码 * @author king_fu * */public class MessageDecoder extends AbstractMessageDecoder { public MessageDecoder() { super(Constants.ADD); } @Override protected AbstractMessage decodeBody(IoSession session, IoBuffer in) { if (in.remaining() < Constants.ADD_BODY_LEN) { return null; } Message m = new Message(); m.setValue(in.getInt()); return m; } public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws Exception { }}
五、添加子类编码器MessageEncoder
/** * 消息编码 * @author king_fu * * @param <T> */public class MessageEncoder<T extends Message> extends AbstractMessageEncoder<T> { public MessageEncoder() { super(Constants.ADD); } @Override protected void encodeBody(IoSession session, T message, IoBuffer out) { out.putInt(message.getValue()); } public void dispose() throws Exception { }}
六、添加子类解码器ResultMessageDecoder
/** * 返回的消息解码 * @author king_fu * */public class ResultMessageDecoder extends AbstractMessageDecoder { private int code; private boolean readCode; public ResultMessageDecoder() { super(Constants.RESULT); } @Override protected AbstractMessage decodeBody(IoSession session, IoBuffer in) { if (!readCode) { if (in.remaining() < Constants.RESULT_CODE_LEN) { return null; } code = in.getShort(); readCode = true; } if (code == Constants.RESULT_OK) { if (in.remaining() < Constants.RESULT_VALUE_LEN) { return null; } ResultMessage m = new ResultMessage(); m.setOk(true); m.setValue(in.getInt()); readCode = false; return m; } else { ResultMessage m = new ResultMessage(); m.setOk(false); readCode = false; return m; } } public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws Exception { }}
七、添加子类编码器ResultMessageEncoder
/** * 返回的消息编码 * @author king_fu * * @param <T> */public class ResultMessageEncoder<T extends ResultMessage> extends AbstractMessageEncoder<T> { public ResultMessageEncoder() { super(Constants.RESULT); } @Override protected void encodeBody(IoSession session, T message, IoBuffer out) { if (message.isOk()) { out.putShort((short) Constants.RESULT_OK); out.putInt(message.getValue()); } else { out.putShort((short) Constants.RESULT_ERROR); } } public void dispose() throws Exception { }}
0 0
- 【MinaFile】【三】写自定义编码解码
- 【MinaFile】【十一】【2.0】实现客户端与服务器交互的自定义编码解码器
- 【MinaFile】【十】【2.0】自定义异常
- mina框架分析:自定义编码解码
- 自定义Base64编码和解码的实现
- C#实现Base64编码与解码 自定义
- APACHE MINA之自定义CODEC(编码/解码)
- 归档自定义对象用到的编码解码
- 数据压缩三-Huffman编码与解码
- 实验三Huffman编码与解码
- 用c语言写的base64编码解码函数!
- 一个VB写的Base64编码/解码程序
- 编码->解码
- 编码 解码
- 编码解码
- 编码 解码
- 编码、解码
- 编码解码
- oracle top newid()
- Ubuntu14.04.2下nginx1.6和sticky1.1模块的安装与简单配置
- Codeforces Round #341 (Div. 2) D. Rat Kwesh and Cheese
- TBB之pipeline
- Software Documentation Tools之LaTeX
- 【MinaFile】【三】写自定义编码解码
- pthread创建和退出
- Eclipse的使用:快捷键、设置、调试
- 分布式系统的本质:拆分+连接
- Jmeter2.13 安装
- Hello World--------------LeapMotion API新建一个程序
- 安装和运行
- 内嵌Activex视频播放的插件问题记录-1
- URL Parsing