【发布时间】:2016-08-03 21:24:50
【问题描述】:
我开发的自定义解码器有问题,我不确定自己做错了什么。
我们收到的消息格式包含 HEADER、BODY 和 TRAILER。标头是 1 个字节,是一个 STX (0x02) 主体是可变长度的 尾部是 2 个字节,其中包含一个 ETX(0x03),后跟一个 LRC。
因此,典型的消息可能如下所示:
STX BODY ETX LRC
02 37000000 06 18
解码器的输出应该是没有 STX 控制字节的消息。所以正在发送的消息是:
BODY ETX LRC
37000000 06 18
我们扩展了 DelimiterBasedFrameDecoder 并将 ETX 定义为分隔符。解码器的意图是读取下一个字节,将其添加到缓冲区,然后继续发送,这样我们就发送了完整的消息。我们的解码方法如下所示:
protected Object decode(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception {
Object frame = super.decode(ctx, buffer);
if (frame == null) {
return null;
}
ByteBuf msg = null;
if (frame instanceof ByteBuf) {
msg = Unpooled.copiedBuffer((ByteBuf) frame);
msg.writeByte(buffer.readByte());
((ByteBuf) frame).release();
}
while (msg.getByte(0) != STX) {
msg.readByte();
msg = msg.discardReadBytes();
}
return msg;
}
一切都按预期工作,除了我们定期收到以下异常。
java.lang.IndexOutOfBoundsException: readerIndex(225) + length(1) exceeds writerIndex(225): UnpooledUnsafeDirectByteBuf(ridx: 225, widx: 225, cap: 256)
我们使用的是 Netty 4.01 CR6,这是一个零星的问题。我不确定,这是我做的不对,还是 Netty 内部的问题。由于我对 Netty 很陌生,我怀疑这是我正在做的事情,但我不确定。
我希望有人可以帮助我解决这个问题。我很乐意发布更多信息来解决这个问题,请问。
感谢我在这方面能得到的任何帮助。
- 蒂姆
【问题讨论】:
标签: netty indexoutofboundsexception decoder