我是靠谱客的博主 眼睛大百褶裙,最近开发中收集的这篇文章主要介绍Netty 心跳机制与断线重连,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

浅析 Netty 实现心跳机制与断线重连

心跳,:
即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性。

为什么需要心跳:
因为网络的不可靠性, 有可能在 TCP 保持长连接的过程中, 由于某些突发情况, 例如网线被拔出, 突然掉电等, 会造成服务器和客户端的连接中断。
在这些突发情况下, 如果恰好服务器和客户端之间没有交互的话, 那么它们是不能在短时间内发现对方已经掉线的。
为了解决这个问题, 我们就需要引入 心跳 机制。

心跳机制的工作原理:
在服务器和客户端之间一定时间内没有数据交互时, 即处于 idle 状态时, 客户端或服务器会发送一个特殊的数据包给对方。
当接收方收到这个数据报文后, 也立即发送一个特殊的数据报文, 回应发送方, 此即一个 PING-PONG 交互。
自然地, 当某一端收到心跳消息后, 就知道了对方仍然在线, 这就确保 TCP 连接的有效性。

两种实现心跳机制:
1、使用 TCP 协议层面的 keepalive 机制。
2、在应用层上实现自定义的心跳机制。

虽然在 TCP 协议层面上, 提供了 keepalive 保活机制, 但是使用它有几个缺点:
1、它不是 TCP 的标准协议, 并且是默认关闭的。
2、TCP keepalive 机制依赖于操作系统的实现, 默认的 keepalive 心跳时间是 两个小时, 并且对 keepalive 的修改需要系统调用(或者修改系统配置), 灵活性不够。
3、TCP keepalive 与 TCP 协议绑定, 因此如果需要更换为 UDP 协议时, keepalive 机制就失效了。

自定义心跳机制关键在于 IdleStateHandler,实例化一个 IdleStateHandler 需要提供三个参数:
1、readerIdleTimeSeconds, 读超时。
 即当在指定的时间间隔内没有从 Channel 读取到数据时, 会触发一个 READER_IDLE 的 IdleStateEvent 事件。
2、writerIdleTimeSeconds, 写超时。
 即当在指定的时间间隔内没有数据写入到 Channel 时, 会触发一个 WRITER_IDLE 的 IdleStateEvent 事件。
3、allIdleTimeSeconds,/写超时。
即当在指定的时间间隔内没有读或写操作时, 会触发一个 ALL_IDLE 的 IdleStateEvent 事件。

使用IdleStateHandler实现心跳:
Client端连接到Server端后,会循环执行一个任务:随机等待几秒,然后ping一下Server端,即发送一个心跳包。
当等待的时间超过规定时间,将会发送失败,以为Server端在此之前已经主动断开连接了。
断线重连,就是客户端和服务端断开连接时,会进行重连。
其有一个doConnect 方法, 它负责客户端和服务器的 TCP 连接的建立。
并且当 TCP 连接失败时, doConnect 会 通过 "channel().eventLoop().schedule" 来延时10s 后尝试重新连接。
我们可以重写 channelInactive 方法。
 当 TCP 连接断开时, 会回调 channelInactive 方法, 因此我们在这个方法中调用 client.doConnect() 来进行重连。

最后

以上就是眼睛大百褶裙为你收集整理的Netty 心跳机制与断线重连的全部内容,希望文章能够帮你解决Netty 心跳机制与断线重连所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部