为啥要用心跳包呢?我觉得有两点,一是保证不活跃的客户端与服务端保持数据连接,二是检测客户端的异常断开。这两点是相关的,可以阐述为:长连接下,客户端可能很长一段时间都与服务端没有数据往来,理论上这个连接是正常的,但是若客户端异常断开(像网线拔掉),实际上连接就被强制断开,客户端无法发出断开连接的请求,服务端也就接收不到客户端断开连接的请求,就需要通过心跳包来实现定时检测。
概念
心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。
心跳检测流程:每隔一段固定时间,服务端给客户端发送一个简单的信息,客户端收到消息后会给服务端返回确认消息,告诉对方自己还活着。若在设置的超时时间内服务端没有收到确认消息,说明客户端由于某种原因掉线了。
主要用途
1、用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经离线。
2、用于检测TCP的异常断开(如:网线拔出、机器断电等)。基本原因是服务器端不能有效的判断客户端是否在线,也就是说,服务器无法区分客户端是长时间在空闲,还是已经掉线的情况。假如客户端主机的网线不小心被拔出,客户端就无法发包,在超时定时器结束后,服务端没接受到包,就会判定客户端已经掉线。