一、聊天服务器心跳机制
引出一个问题:聊天服务器中,如果网络拥塞严重,ChatServer如何感知客户端在线还是掉线了?
答:基于长连接的业务 -> 心跳保持机制!!!
首先要知道:同一台机器上的不同协议,可以各自独立使用相同的端口号!
现在把ChatServer服务器分成两个部分:TCP:8080做通用业务处理,UDP:8080做心跳业务处理
在ChatServer端会给connect成功的client分配一个心跳计数器,并且ChatServer启动心跳计时器
只要启动心跳计时器,每过1秒就把所有client的心跳计数器+1;与此同时,客户端每隔1秒也会给ChatServer发送一个heartbeat信息
只要ChatServer收到了对应client的heartbeat信息,就把心跳计数-1。正常来说心跳计数器会在-1、0、1之间摆动;如果心跳计数超过5,就判定client已经掉线,拆除这个client的所有连接和其他资源
图图u突突突突突u凸凸凸凸
二、TCP协议的保活功能
和上述功能类似的就是TCP的keep-alive功能了(保活功能)
TCP的keep-alive功能默认是关闭的,需要手动开启:setsockopt -> SO_KEEPALIVE
chq@iZn4a0ov5mlzjl9h6qyhxkZ:~$ sysctl -a | grep keepalive(查看相关参数)
net.ipv4.tcp_keepalive_intvl = 75 # 如果探测没有相应,延迟75秒继续发送探测包
net.ipv4.tcp_keepalive_probes = 9 # 最多探测9次,如果都没有响应就拆除连接
net.ipv4.tcp_keepalive_time = 7200 # 默认每隔2个小时,发送一个空报文段,探测对方是否在线