今天和大家一块学习一下即时通讯中的心跳机制。有一些小伙伴私下问为什么不直接开始上干货。我这边个人感觉是socket是一个比较大,牵扯的知识点比较多,从外围一点一点的了解学习socket,然后完全掌握。
心跳机制
心跳机制的原理很简单:客户端每隔N秒向服务端发送一个心跳消息,服务端收到心跳消息后,回复同样的心跳消息给客户端。如果服务端或客户端在M秒(M>N)内都没有收到包括心跳消息在内的任何消息,即心跳超时,我们就认为目标TCP连接已经断开了。
心跳的作用
-
通知服务器,客户端存活状态,一旦服务器监测到在某段时间没有收到客户端发来的心跳包,服务器就会释放曾经为此客户端分配的所有资源,例如Socket连接
-
定时的刷新NAT内外网IP映射表,以便防止NAT路由器移除映射表,导致客户端和服务器端的连接中断户体验。
心跳的实现方案
心跳的方案实现有很多种我这里重点说一下比较有代表性的两种心跳机制。
方案一:服务器主动发送心跳包
服务器建立定时器,定时发送心跳包给到客户端,客户端收到心跳包后,立即发送心跳包给到服务器,服务器收到客户端发来的心跳包后确认客户端的连接可用,不执行释放socket相关的操作。如果服务器端没规定的时间间隔内没有收到客户端响应的心跳包,服务器端就认为客户端的连接不可用,执行释放socket相关的操作。有点是服务器端能够准确的掌握客户端是否在线,缺点是对服务器端性能要求较高。
方案二:客服端主动发送心跳包
客户端定时主动的发送心跳包给到服务器端,服务器端收到心跳包后对相关的socket进行加标识,然后服务器端发送响应心跳包给到客户端。客户端收到心跳包认为连接可用。如果服务器端超过一段时间没有收到心跳包,相关的socket的标识符回进行降权,直至失效,然后服务器端会释放这个socket相关的资源。这个对服务器的性能要求不那么高,我这边由于用手机作为一个server来处理数据的,性能差,所以我这边服务器端接收到客户端发来的心跳包以后,并没有给客户端发响应心跳包,只是做了加标识符的操作。
参考文章:https://blog.csdn.net/youniworld/article/details/47300019
更多优质文章,可以微信扫码关注: