在有线(网线)建立的 websocket 连接,如果直接物理拔线会导致无法接收到断开连接的通知,并且连接一直存在,但是当再次插上有线(网线)之前的 websocket 又可以使用。该如何正确的关闭断开的连接呢
1
danbai 2023-09-25 20:31:02 +08:00 via Android
心跳
|
2
leonshaw 2023-09-25 20:32:06 +08:00
TCP 或者应用层 keepalive
|
3
swulling 2023-09-25 20:42:25 +08:00
websocket 协议里有 ping-pong ,开启就好了。
|
4
runningman 2023-09-26 09:32:55 +08:00
服务器得定时检查,如果失败,就得及时清理,当然,客户端也需要发送心跳,
|
5
guonaihong 2023-09-27 23:41:40 +08:00
服务端在 read/write 的地方加超时时间和心跳。心跳就由客户端向服务端发,毕竟客户端要做链接保活的。
分两种情况讨论: 1. 主动推送场景(s->c): 比如红点,点赞,收藏,关注的通知。服务端在 WriteMessage 的时候加个稍短的超时时间。超时了就关闭这个 conn ,主动踢掉坏的 conn 。 2. 客户端主动要推消息到客户端这种(c->s): 客户端确认连接的健康度,做法的话 2.1 在 WriteMessage 的时候加些超时时间 2.2 加些心跳检查,定时 ping/pong ,超时间根据业务的敏感度,和服务端压力定个值,最后失败的话再用指数退避定个失败的重试时间。 所以做法就是开头聊的方式。 |