0

私の Netty コードでは、LDAP PDU を処理する FrameDecoder を作成しています。PDU が完了したか (状態はPDU_DECODED)、またはさらにデータが必要か ( VALUE_STATE_PENDING) を判断できるコードがあります。さらに、検出できるエラー条件がいくつかあります。

ほとんどの場合、1 回の読み取りで PDU 全体が取得されると思います。しかし、より多くのデータを取得するために別の読み取りが必要な場合に備えて、それをコーディングする最良の方法を知りたいと思っています。

今、私decode()はリーダー インデックスをマークしbuf.markReaderInded()ています。利用可能なバイトを読み込んでいます。読み込んだバイトをチェックして、それが有効な PDU かどうかを確認します。そうであれば、読み取ったバイト数を返します。そうでない場合は、リーダー インデックスをリセットし、buf.resetReaderIndex()null を返します。次に戻ってくるdecode()と、元のデータと次の読み取りからのデータが表示されます。チェックを再度実行できます。

しかし、最初に読み取った元のデータを保存し、次の読み取りで残りの PDU (または次の部分) を取得したいと考えています。次に、フレームデコーダーのインスタンスに既に保存されているデータにそのデータを追加し、それが有効な PDU であるかどうかを確認します。今回は、リーダー インデックスをリセットせずbuf.resetReaderIndex()に、null を返しただけです。

ところで、私はすでにsetAttachment()/getAttachment()を使用して情報を に格納していChannelHandlerContextます。だから私はそれを使用することはできません。接続できたら設定します。

もう一度decode()に戻ったときの状態がわかりません。FrameDecoderそれは私のクラスの同じインスタンスですか、それとも新しいインスタンスですか? 使用できるようになる前に、変数を定義して設定する必要がありますか? Netty がここで何をしているのかわかりません。

ありがとうございました。

4

1 に答える 1

1

NettyReplayingDecoderが必要なようです。基本的に、デコードステップまたはチェックポイントを列挙型のメンバーとして定義します。オブジェクトの最初の呼び出しで読み取りを開始し、バッファーを読みすぎるとすぐに、nettyは自動的に受信データを「待機」し、データを取得すると再生します。既知のチェックポイントに到達したら、デコーダーを次の状態に移行します。nettyがデコーダーを呼び出すと、最後の既知の状態が渡されるため、自分がどこにいるかを常に把握できます。複雑なオブジェクトを処理したり、デコード内に条件付きブランチがある場合に最適です。ここに良いチュートリアルがあります。

于 2013-01-30T19:09:49.190 に答える