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

Binary Netty 5.0.0:不完整帧中的字节被丢弃,binary,netty,message,decoder,Binary,Netty,Message,Decoder,我正在为二进制消息格式编写一个解码器处理程序,它可以解码到可用字节中消息的最后一个完整元素。因此,如果有一个int64值数组,则读取8个字节中的最高倍数,该倍数小于ByteBuf.readableBytes()。我正在使用netty 5.0.0.2 我的问题是,Netty似乎正在丢弃ByteBuf中剩余的未读字节,而不是向它们添加新的网络字节;这意味着当我尝试恢复解码时,它失败了,因为缺少字节和损坏的流 是否有ChannelHandlerContext或ByteBuf或Channel方法,我应该

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

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

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

谢谢

迈克尔

PS:我不喜欢使用
ReplayingDecoder
ByteToMessageDecoder
类,因为在它们周围安装我的解码器库会太麻烦(IMHO)

我是否应该调用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());
    }
}

您所期望的帧长度是多少?它可能会有所不同,但可能会达到2GB。我想我可能已经通过
解决了它。保留
ByteBuf
如果其中仍然有可读字节,并保留句柄直到下一次读取,然后将其和“新的”
ByteBuf
包装在复合缓冲区中。我会在某个时候写点东西,除非有人能想出更好的答案;)嗨,信任,谢谢你的回答。我已经看到了ByteToMessageDecoder的
,但由于消息的大小可能高达2GB,因此该解码器专门设计为可恢复并支持“窗口读取”。关键是,我应该能够使用256Kb的读取缓冲区,以任何给定(正常)块大小读取2GB的消息。(1/2)最初的问题是如何处理部分读取结束时留在缓冲区中的未读字节,这可能不是8的倍数——这只是一个示例,说明字节如何保持未读状态。有不同的数据类型,特别是长度不同的字符串类型:例如“this is a char vec value”.length()。我明白了。那你就得实现一些状态机了。根据协议的复杂性,它可能有点混乱。请查看
HttpObjectDecoder
以获取示例。不过,您可以在不使用
ByteToMessageDecoder
的情况下实现解码器。