golang如何实现WebSocket断线重连_golang WebSocket断线重连实现要点

WebSocket断开后ReadMessage()立即返回错误而非重试,需显式判断关闭原因并用退避策略重连,同时分离读写逻辑、管理发送队列与心跳定时器。WebSocket连接断开后,conn.ReadMessage() 会直接报错Go 的 gorilla/websocket 库中,一旦底层 TCP 连接断开(比如网络抖动、服务端重启、NAT 超时),conn.ReadMessage() 不会阻塞等待,而是立即返回 *websocket.CloseError 或 io.EOF。很多人误以为它会"自动重试",其实不会------它只是读操作,不负责连接生命周期管理。常见错误现象:? 程序静默退出读循环,不再收消息? 没有触发重连,客户端彻底失联? 日志里反复出现 read tcp: use of closed network connection必须在 ReadMessage() 的 error 分支里显式判断是否为连接已断(如 websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway))不要只检查 err != nil 就 panic 或 return,要区分临时错误(如 net.OpError)和永久断连读循环外层建议用 for + select 控制,避免 goroutine 泄漏重连逻辑不能写在 ReadMessage() 错误处理里硬循环如果在读失败后直接 while(true) { dial(); time.Sleep() },容易卡死 goroutine、耗尽资源,还可能掩盖真实错误(比如证书过期、域名解析失败)。正确做法是把重连抽成独立控制流,和读/写解耦:立即学习"go语言免费学习笔记(深入)";用一个单独的 goroutine 管理连接状态,监听 ctx.Done() 或自定义的 reconnectCh每次重连前加退避(backoff),比如从 100ms 开始,指数增长到最大 30s,避免雪崩式重连重连成功后,重新启动读/写 goroutine,并同步重置心跳计时器(否则旧 timer 可能还在往已关闭的 conn 写 ping)务必在重连前调用 conn.Close(),否则旧连接 fd 不释放,Linux 下很快 hit ulimitwebsocket.DefaultDialer 缺省配置不支持长连接保活默认 dialer 不设 Proxy、TLSClientConfig、HandshakeTimeout,更关键的是没配 KeepAlive 和 WriteDeadline,导致 NAT 中间件(如家用路由器、云厂商 LB)在 60s 左右静默 kill 连接。 Tellers AI Tellers是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。

相关推荐
S1998_1997111609•X38 分钟前
论当今社会主义与人文关怀人格思想下的恶意仿生注入污染蜜罐描述进行函数值非法侵入爬虫的咼忄乂癿〇仺⺋.
数据库·网络协议·百度·ssh·开闭原则
我叫黑大帅1 小时前
如何通过 Python 实现招聘平台自动投递
后端·python·面试
其实防守也摸鱼1 小时前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
砚底藏山河1 小时前
Python量化开发:2026最佳实时股票数据API接口推荐与对比
开发语言·windows·python
倔强的石头_2 小时前
kingbase备份与恢复实战(六)—— 备份自动化与保留策略:Windows任务计划+日志追溯
数据库
研究点啥好呢2 小时前
专为求职者开发的“面馆”!!!摆脱面试焦虑!!!
python·面试·开源·reactjs·求职招聘·fastapi
轻刀快马2 小时前
别被 ORM 框架宠坏了:从一场“订单消失”悬案,看懂 MySQL 为什么要强推 InnoDB
数据库·mysql
DFT计算杂谈3 小时前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
EW Frontier4 小时前
6G ISAC新范式:基于智能漏波天线的Wi‑Fi通感一体化系统设计与实测【附MATLAB+python代码】
开发语言·python·matlab·music·isac·doa·wi‑fi
姚青&4 小时前
测试技术体系
java·python