网络切换后客户端重连成功,日志显示连接已建立,可后续十分钟一条推送都没收到。服务端那边显示这个连接没有订阅任何频道。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
ws.onopen = () => { subscribe(channels); };
ws.onclose = () => setTimeout(connect, backoff());
重连只重建了连接,订阅动作写在首次连接的回调里,重连路径没有走那段代码。服务端按连接维度保存订阅关系,连接一断就清空,新连接自然是空的。这一点先确认清楚,后面就不用反复试。
碰到「断线重连」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。
具体做法是,把订阅逻辑抽成单独函数 连接建立后统一调用一次;重连时带上上次的订阅列表或断点位置 让服务端恢复;加一个应用层心跳 连续两次没回 pong 就主动断开重连;重连退避从一秒起翻倍 上限三十秒 避免重连风暴。
改完照着核一遍,手动断网十秒再恢复 重连后能收到新推送 服务端连接列表里有对应频道。
