netty FrameDecoder 解码遇到问题

在使用 protobuf 做为通信协议 时候遇到的一个问题  :

使用FrameDecoder   解码 的时候 报  IndexOutOfBoundsException  错误找了好几天 才发现 原来是 netty使用FrameDecoder 解码  并没有把 一个协议包的内容读完  ,就调用了后面的业务逻辑代码,造成业务逻辑在解析 包的内容时长度不够,报错。


  果断上代码:

public class XdriveProtobufDecoder extends FrameDecoder {

    private static final Logger log = Log.getLogger();
    private static final Logger warn_log = Log.getLoggerWithPrefix("lengthToLong");
    private static final Logger error_log = Log.getLoggerWithPrefix("respStatusFailed");

    @Override
    protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer cb) throws Exception {
        int readableBytes = cb.readableBytes();
        if (readableBytes < XdriveProtobufMessage.default_header_length) {  //这里读的时候 ,只判断了协议头的长度
            log.error("Rev Bytes Num[{}] is less than default_header_length[{}]", readableBytes, XdriveProtobufMessage.default_header_length);
            return null;
        }
        try {
            XdriveProtobufMessage r = XdriveProtobufMessage.decodeMessage(cb);  //解析的时候报IndexOutOfBoundsException  错误
            if (r.isMessageWarn()) {
                warn_log.error("decode:{},channel:{}", r, channel);
            } else {
                log.debug("decode:{},channel:{}", r, channel);
            }
            return r;
        }  catch (Exception e) {
            error_log.error("", e);
            throw e;
        }
    }


解决办法 ,解析之前判断body 长度 是否够,不够 return  null ,先不运行解析的代码,等下次完全返回了再解析




你可能感兴趣的:(java)