请教一个关于 go websocket 的问题

2023-09-25 20:29:03 +08:00
 chengiri

在有线(网线)建立的 websocket 连接,如果直接物理拔线会导致无法接收到断开连接的通知,并且连接一直存在,但是当再次插上有线(网线)之前的 websocket 又可以使用。该如何正确的关闭断开的连接呢

1036 次点击
所在节点    Go 编程语言
5 条回复
danbai
2023-09-25 20:31:02 +08:00
心跳
leonshaw
2023-09-25 20:32:06 +08:00
TCP 或者应用层 keepalive
swulling
2023-09-25 20:42:25 +08:00
websocket 协议里有 ping-pong ,开启就好了。
runningman
2023-09-26 09:32:55 +08:00
服务器得定时检查,如果失败,就得及时清理,当然,客户端也需要发送心跳,
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 ,超时间根据业务的敏感度,和服务端压力定个值,最后失败的话再用指数退避定个失败的重试时间。

所以做法就是开头聊的方式。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/977082

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX