私が開発したカスタムデコーダに問題があり、間違っていることがわかりません。Netty 4.01でSparodic OutOfBoundsの問題CR6
私たちが受け取るメッセージフォーマットには、ヘッダー、ボディー、およびトレーラーが含まれています。ヘッダーは1バイトでSTX(0x02)です。本文は可変長です。トレーラーはETX(0x03)とそれに続くLRCを含む2バイトです。
ので、一般的なメッセージは、次のようになります。デコーダの出力はSTX制御バイトなしのメッセージでなければなりません
STX BODY ETX LRC
02 37000000 06 18
。だから、上で送信されるメッセージは次のとおりです。
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にかなり新しいので、私はそれが私がやっていることだと思っていますが、わかりません。
私は誰かがこれを解決するのを助けることを望んでいます。私はこれ以上の情報を投稿してこの問題を解決してくれることを嬉しく思います。
私はこの1つを得ることができるすべての援助に感謝します。
- ティム