👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。
1. 原理
客户端每隔N秒向服务端发送一个心跳消息,服务端收到心跳消息后,回复同样的心跳消息给客户端。如果服务端或客户端在M秒(M>N)内都没有收到包括心跳消息在内的任何消息,即心跳超时,就认为目标TCP连接已经断开。
2. 作用
通知服务器,客户端存活状态,一旦服务器监测到在某段时间没有收到客户端发来的心跳包,服务器就会释放曾经为此客户端分配的所有资源,例如Socket连接
3. 实现方案
3.1 方案一:服务器主动发送心跳包
服务器建立定时器,定时发送心跳包给到客户端,客户端收到心跳包后,立即发送心跳包给到服务器,服务器收到客户端发来的心跳包后确认客户端的连接可用,不执行释放socket相关的操作。
如果服务器端没规定的时间间隔内没有收到客户端响应的心跳包,服务器端就认为客户端的连接不可用,执行释放socket相关的操作。
优势:对于那些需要管理和监控大量客户端连接的服务器来说,服务器可以更加主动地控制和释放不活跃的连接,及时回收资源。
劣势:当客户端数量非常大时,服务器可能需要频繁地发送大量心跳包,这可能会导致不必要的网络和服务器负载。对服务器的要求比较高。
3.2 方案二:客服端主动发送心跳包
客户端定时主动的发送心跳包给到服务器端,服务器端收到心跳包后对相关的socket进行加标识,然后服务器端发送响应心跳包给到客户端。客户端收到心跳包认为连接可用。
如果服务器端超过一段时间没有收到心跳包,相关的socket的标识符回进行降权,直至失效,然后服务器端会释放这个socket相关的资源。这个对服务器的性能要求不那么高。
优势:服务器不需要主动检查每一个连接的状态,而是由客户端主动报告其状态,这样可以减轻服务器的负担。
劣势:客户端需要实现心跳逻辑,并确保在连接期间定期发送心跳。对于电池供电的移动设备来说,频繁的心跳可能会消耗更多的电量。