1

基本的に、次のデコーダーがあります。

public class Decoder extends ReplayingDecoder<Packet, Void> {

@Override
public Packet decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
    short id = in.readUnsignedByte();
    Packet packet = Packet.newInstance(id);
    if (packet == null) {
        throw new IOException("Wasn't prepared to deal with packet 0x" + Integer.toHexString(id));
    }
    packet.read(in);
    return packet;
}

}

ストリームから入力を取得し、符号なしバイト パケット ID を読み取り、そのバイトを使用してデコーダを構築するように設計されていますが、ここでの問題は、無効な入力 (IOException がスローされる場所) でシステムをシャットダウンすることです。ChannelHandlerContext.close() と ChannelHandlerContext.channel().close() を使用してみましたが、どちらもループ内で Decoder を呼び出すことになり、スタックしてしまいます。

この接続を適切に閉じる方法を教えてください。

余談ですが、読み取りが x ミリ秒以上ブロックされたときに接続を終了する方法を知っておくとよいでしょう。

4

1 に答える 1

1

非アクティブな接続を閉じるにはReadTimeoutHandler、パイプラインにを追加します。ReadTimeoutException指定された期間内にデータが受信されなかった場合、タイムアウトハンドラーはをスローします。この例外は、 on無効な入力exceptionCaught()を処理するのと同じ方法でメソッドで処理できます。IOException

于 2012-08-18T13:25:06.347 に答える