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() 但这两个最终都在循环中调用解码器并且我被卡住了。

请给我一些帮助以优雅地关闭此连接。

附带说明一下,当读取阻塞超过 x 毫秒时,知道如何终止连接也很好。

4

1 回答 1

1

要关闭非活动连接,您可以将 a 添加ReadTimeoutHandler到管道中。ReadTimeoutException当在指定的时间段内没有收到数据时,超时处理程序将抛出一个。您可以在方法中以与处理无效输入exceptionCaught()相同的方式处理此异常。IOException

于 2012-08-18T13:25:06.347 回答