Netty 5.0.0:丢弃不完整帧中的字节

时间:2015-04-11 00:32:02

标签: binary netty message decoder

我正在为二进制消息格式编写解码器处理程序,可以在可用字节中解码消息的最后一个完整元素。因此,如果存在int64值的数组,则读取8个字节的最大倍数,该值小于ByteBuf.readableBytes()。我正在使用netty 5.0.0.Alpha2。

我的问题是,看起来Netty正在丢弃ByteBuf中剩余的未读字节,而不是向它们添加新的网络字节;这意味着当我尝试恢复解码时,它会因为缺少字节和损坏的流而失败。

我应该调用ChannelHandlerContextByteBufChannel方法来保留这些未读字节吗?或者是当前/唯一的解决方案,将它们保存在处理程序内的临时空间中?我怀疑缓冲池是后续读取使用不同缓冲区的原因。

由于

迈克尔

PS:我并不热衷于使用ReplayingDecoderByteToMessageDecoder类,因为在我们周围使用我的解码器库会过于干扰(恕我直言)。

1 个答案:

答案 0 :(得分:0)

  

我应该调用ChannelHandlerContext或ByteBuf或Channel方法来保存那些未读的字节吗?或者是当前/唯一的解决方案,将它们保存在处理程序内的临时空间中?我怀疑缓冲池是后续读取使用不同缓冲区的原因。

那是ByteToMessageDecoder的作用。如果我理解正确,你希望你的缓冲区总是有n * 8个字节。

public class Int64ListDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ctx, in, out) {
        final int inLen = in.readableBytes();
        final int outLen = inLen / 8 * 8;
        out.add(in.readSlice(outLen).retain());
    }
}