基本上我有以下解码器:
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毫秒,那么知道如何终止连接也是一件好事。
答案 0 :(得分:1)
要关闭非活动连接,您可以向管道添加ReadTimeoutHandler
。在指定时间段内未收到任何数据时,超时处理程序将抛出ReadTimeoutException
。您可以在exceptionCaught()
方法中处理此异常,方法与处理无效输入上的IOException
相同。