← 笔记

pong 要从收到 ping 的那条连接回

约 1 分钟#WebSocket#Android

安卓端一天建了 159 次 WebSocket 连接,160 次异常断开。三个小毛病叠在一起,每回一次前台就多一条僵尸连接。

第一处:强制重连只在地址变了的时候才关旧连接,地址没变就直接新建,旧的那条留在原地。第二处:回复服务端 ping 的 pong 用的是「当前连接」的引用,而不是收到 ping 的那条连接,于是旧连接永远不回 pong,只能等服务端心跳超时把它踢掉。第三处:每次回到前台都无条件强制重连。

服务端也有一半:从注册表里移除连接时只删了记录,没关 socket,留下服务端看不见、客户端还以为在线的半开连接。

修法都很小:重建前先关旧的;被新连接替换的直接关掉;pong 从收到 ping 的那条连接发;已经连着就只做状态同步,不重建;服务端注销后在锁外补一次 close。

作者Shihao Qi