Netty 如何实现心跳机制与断线重连?

  • 日期:07-26
  • 点击:(1174)


作者:sprinkle_liz

来源:

心跳机制

什么是心跳

所谓的心跳,即TCP长连接中客户端和服务器之间定期发送的特殊报文,通知对方仍然在线,确保TCP连接的有效性。

注意:心跳包具有另一种效果,通常会被忽略。也就是说,如果连接长时间未使用,防火墙或路由器将断开连接。

如何实现

核心处理程序 IdleStateHandler

在Netty中,实现心跳机制的关键是IdleStateHandler,那么这个Handler是如何使用的呢?让我们看一下它的构造函数:

Public IdleStateHandler(int readerIdleTimeSeconds,int writerIdleTimeSeconds,int allIdleTimeSeconds){

这((长)readerIdleTimeSeconds,(long)writerIdleTimeSeconds,(long)allIdleTimeSeconds,TimeUnit.SECONDS);

}

以下是接下来三个参数的含义:

readerIdleTimeSeconds:读取超时。也就是说,当在指定的时间间隔内没有从通道读取数据时,会触发READER_IDLE的IdleStateEvent事件。 writerIdleTimeSeconds:写入超时。也就是说,当在指定的时间间隔内没有数据写入通道时。触发WRITER_IDLE.allIdleTimeSeconds:读/写超时的IdleStateEvent事件。也就是说,当在指定的时间间隔内没有读或写操作时,会触发ALL_IDLE的IdleStateEvent事件。

注意:这三个参数的默认时间单位是秒。如果需要指定其他时间单位,可以使用另一个构造函数:IdleStateHandler(boolean observeOutput,long readerIdleTime,long writerIdleTime,long allIdleTime,TimeUnit unit)

在查看下面的实现之前,建议先了解IdleStateHandler的实现原理。

以下代码直接在您需要注意的代码中,将在代码中通过注释进行解释。

使用IdleStateHandler实现心跳

以下将使用IdleStateHandler来实现心跳。客户端连接到服务器后,它将循环执行任务:随机等待几秒钟,然后ping服务器,即发送心跳包。当等待时间超过指定时间时,它会发送一个故障,认为服务器在此之前已经主动断开连接。代码如下:

客户端

ClientIdleStateTrigger心跳触发

ClientIdleStateTrigger类也是一个Handler,只是覆盖userEventTriggered方法来捕获IdleState.WRITER_IDLE事件(不在指定时间内向服务器发送数据),然后将心跳包发送到服务器。

3f5f68e7571c4b15be09c0b850a3a3ea

Pinger Heartbeat Launcher

6e9ff1ac04fc45b7bc9fa4ce36566e0a

31e9befce66441ef9661db2004d01de9

ClientHandlersInitializer客户端处理器集合的初始化类

7c37c23dd306407e8a2e38e838c6563c

注意:除了Pinger之外,上面的Handler集合是一个编解码器并且可以解决粘性数据包,可以忽略。

TcpClient TCP连接客户端

0e7cf52c6efc4285bfdacc70b3a4876a

4dd049a3098241ec9e6f7240a7c20014

服务器端

ServerIdleStateTrigger断开触发器

74202ddf99e647fd9eeaf7f99cc75c32

ServerBizHandler服务器端业务处理器

92354f594a17443484662e919a2d91bc

6fc8ab0437a84119a0b1d750452af013

ServerHandlerInitializer服务器端处理器集合的初始化类

241aa6249f1a4a79bebc4f27bcb6d56f