【MinaFile】【三】写自定义编码解码

一、添加常量类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 {
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值