2016-04-13 12 views
0

私が開発したカスタムデコーダに問題があり、間違っていることがわかりません。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つを得ることができるすべての援助に感謝します。

  • ティム

答えて

0

この例外は、あなたがそれの終わりに達したので、あなたは、それが含まれていませんbytebufからバイトを読み込むしようとしていることを意味します。

クライアントが無効なデータを送信しているか、プロトコル内のすべてのパケットにメッセージ内にSTXが含まれていません。

既存のプロトコルをデコードする際によくある間違いは、デリミタとして使用しているバイトシーケンスがパケット自体の内部で使用されており、バイトごとにパケットを読み取ることが予想されることです。

デコーダーに流れるパケットを確認したい場合は、デコーダーが実行される直前にLoggingHandler(LogLevel.INFO)をパイプラインに追加して、生のバイトを16進数として出力することができます。実際には必要なバイトシーケンスが含まれています。

サイドノートmsgに格納されているbytebufを公開することは決してありません。これによりメモリリークが発生し、最終的にOOMにつながります。try-finallyブロックでreleaseを呼び出すようにしてください。常に呼び出されるようにしてください。

関連する問題