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