Netty解码器无限循环
Netty decoder is infinitely looping
第一次在这里使用 Netty,我的 ByteToMessageDecoder class 有一个错误,我不知道出了什么问题。
我重复地从我的客户端向服务器发送固定长度的数据包,如下所示:
public void sendPacket(Packet packet)
{
ByteBuf buf = Unpooled.wrappedBuffer(packet.getBytes());
future.channel().writeAndFlush(buf);
}
客户端管道只包含一个工作的 LengthFieldPrepender,它预先设置短片的长度。
我的服务器解码器正常工作一段随机时间(通常为 30 - 60 秒),然后开始无限循环。
public class TestDecoder extends ByteToMessageDecoder
{
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception
{
if (in.readableBytes() < Short.BYTES)
return;
int packetLength = in.readShort();
if (in.readableBytes() < packetLength)
{
in.resetReaderIndex();
return;
}
System.out.println(packetLength + " " + in.readableBytes());
out.add(in.readBytes(packetLength));
}
}
一段时间后,我的解码器陷入无限循环,其中 packetLength 是正确的值,但 in.readableBytes() 增加到大于 packetLength。
当发生这种情况时,似乎输入缓冲区字节不再被读取到输出列表,因此它无限重复并且不再接受发送到服务器的任何新字节(in.readableBytes() 永远不会改变)。
我做错了什么?
在int packetLength = in.readShort();
之前你必须标记阅读索引:
in.markReaderIndex();
或者使用 LengthFieldBasedFrameDecoder,它是一个内置解码器,可以根据消息中长度字段的值动态拆分接收到的 ByteBuf
。
第一次在这里使用 Netty,我的 ByteToMessageDecoder class 有一个错误,我不知道出了什么问题。
我重复地从我的客户端向服务器发送固定长度的数据包,如下所示:
public void sendPacket(Packet packet)
{
ByteBuf buf = Unpooled.wrappedBuffer(packet.getBytes());
future.channel().writeAndFlush(buf);
}
客户端管道只包含一个工作的 LengthFieldPrepender,它预先设置短片的长度。
我的服务器解码器正常工作一段随机时间(通常为 30 - 60 秒),然后开始无限循环。
public class TestDecoder extends ByteToMessageDecoder
{
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception
{
if (in.readableBytes() < Short.BYTES)
return;
int packetLength = in.readShort();
if (in.readableBytes() < packetLength)
{
in.resetReaderIndex();
return;
}
System.out.println(packetLength + " " + in.readableBytes());
out.add(in.readBytes(packetLength));
}
}
一段时间后,我的解码器陷入无限循环,其中 packetLength 是正确的值,但 in.readableBytes() 增加到大于 packetLength。
当发生这种情况时,似乎输入缓冲区字节不再被读取到输出列表,因此它无限重复并且不再接受发送到服务器的任何新字节(in.readableBytes() 永远不会改变)。
我做错了什么?
在int packetLength = in.readShort();
之前你必须标记阅读索引:
in.markReaderIndex();
或者使用 LengthFieldBasedFrameDecoder,它是一个内置解码器,可以根据消息中长度字段的值动态拆分接收到的 ByteBuf
。