我正在为二进制消息格式编写解码器处理程序,可以在可用字节中解码消息的最后一个完整元素。因此,如果存在int64
值的数组,则读取8个字节的最大倍数,该值小于ByteBuf.readableBytes()
。我正在使用netty 5.0.0.Alpha2。
我的问题是,看起来Netty正在丢弃ByteBuf
中剩余的未读字节,而不是向它们添加新的网络字节;这意味着当我尝试恢复解码时,它会因为缺少字节和损坏的流而失败。
我应该调用ChannelHandlerContext
或ByteBuf
或Channel
方法来保留这些未读字节吗?或者是当前/唯一的解决方案,将它们保存在处理程序内的临时空间中?我怀疑缓冲池是后续读取使用不同缓冲区的原因。
由于
迈克尔
PS:我并不热衷于使用ReplayingDecoder
或ByteToMessageDecoder
类,因为在我们周围使用我的解码器库会过于干扰(恕我直言)。
答案 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());
}
}