首先我添加了一个 netty 自带的心跳检测事件:
channel.pipeline().
//定义超时时间,参数分别为接收超时、发送超时、所有超时的时间
addLast(new IdleStateHandler(60,0,0)).
即 1 分钟未收到数据包就断开连接
这是断开事件的处理:
/**
* TCP 事件触发管理
*/
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {//超时事件
IdleStateEvent idleEvent = (IdleStateEvent) evt;
//超时一段时间未接收到消息
if (idleEvent.state() == IdleState.READER_IDLE) {//读
//断开连接
ctx.channel().close();
}
}
super.userEventTriggered(ctx, evt);
}
现在问题来了,某个设备断电了,两秒后通电又重连了,然而在过了 60 秒后这个事件被触发了!因为老的连接通道一直未接收到数据,这时我会断开老的连接:ctx.channel().close(); ,我理想中的情况是老的连接就废弃了就让它断开嘛,新的连接通道继续使用就是,然而在我断开老的连接时新的连接也会断开。
这就导致了刚刚才通电恢复连接的设备又得重连,因此,想请教一下ctx.channel().close() 难道不是关闭当前的连接通道吗?为什么会将重新连接的通道也关闭了?
我也试过如果重连了就不关闭通道,但是不关闭的话该事件会一直触发,每 60 秒触发一次。