JS客户端连接Gin集成的go-socket.io服务端出现反复重连问题
问题根因
你遇到的反复重连问题,核心是Socket.IO服务端与客户端版本不兼容,再加上心跳配置、跨域中间件的小问题共同导致的:
googollee维护的go-socket.io v1.x版本,仅兼容Socket.IO JS客户端v2.x版本,你当前使用的客户端版本过低,版本协议不匹配会导致握手成功后心跳校验失败,服务端主动断开连接,客户端触发自动重连逻辑,就出现了循环连接断开的现象。
解决方案
你可以按以下步骤依次修改:
- 对齐客户端版本
将HTML中Socket.IO客户端的版本替换为v2.x系列(比如v2.4.1),和服务端go-socket.iov1.x版本兼容即可。 - 对齐心跳配置
初始化Socket.IO服务端时,显式配置心跳参数,和客户端参数匹配:
import "time" // 新增导入 // 替换原来的server初始化代码 server := socketio.NewServer(&socketio.ServerConfig{ PingTimeout: time.Second * 60, PingInterval: time.Second * 25, })
- 修复跨域中间件问题
删除Gin跨域中间件中手动删除Origin头的代码,go-socket.io内部会基于Origin头做跨域校验,手动删除会导致校验异常:
// 删掉这行代码即可 c.Request.Header.Del("Origin")
- 修复客户端语法错误
删除JS代码中多余的斜杠,避免语法报错:
// 原来的代码末尾多了个/,修改为 socket.emit('my new event', { my:'new data' });
修改完成后重启服务,即可解决反复重连的问题。
内容的提问来源于stack exchange,提问作者Allan Ruin
相关产品推荐
相关产品推荐

