Netty解码器是无限循环的



第一次在这里使用Netty时,我的ByteToMessageDecoder类出现了一个错误,我无法找出问题所在
我重复地从客户端向服务器发送固定长度的数据包,如下所示:

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
当这种情况发生时,输入缓冲区字节似乎不再被读取到输出列表中,因此它被无限重复,不再接受任何发送到服务器的新字节(在.readableBytes((中从未更改(
我做错了什么?

int packetLength = in.readShort();之前,您必须标记读取索引:

in.markReaderIndex();

或者使用LengthFieldBasedFrameDecoder,它是一个内置解码器,可根据消息中长度字段的值动态拆分接收到的ByteBuf

相关内容

  • 没有找到相关文章

最新更新