WebSocket 连接可能因为多种原因断开:客户端网络切换(如从Wi-Fi切换到移动数据)、网络设备重启、服务器进程崩溃、NAT超时(长时间无数据传输导致网络地址转换设备释放映射条目)等。为了及时检测到连接断开,WebSocket协议定义了Ping/Pong帧作为心跳机制:任一端都可以发送Ping帧(Opcode=0x9),接收方必须尽可能快地回复Pong帧(Opcode=0xA)。如果一段时间内没有收到Pong响应,发送方可以认为连接已经失效,主动关闭连接。
与SSE 不同,WebSocket没有内置的自动重连机制。当连接意外断开时,浏览器的WebSocket对象会触发onclose事件,但不会自动尝试重新连接。开发者需要自行实现重连逻辑,通常的做法是:在onclose事件处理函数中,设置一个定时器,等待一段时间后尝试重新创建WebSocket 连接。为了避免频繁重连对服务器造成压力,应该使用指数退避算法(Exponential Backoff)来调整重连间隔:第一次断开后等待1秒,第二次等待2秒,第三次等待4秒,以此类推,直到达到最大等待时间(如30秒)。
在重连成功后,客户端可能需要恢复之前的会话状态:例如,在聊天应用中,需要重新加入之前的聊天房间;在协作编辑应用中,需要重新获取文档的最新状态。为了实现这一点,可以在应用层设计重连协议:客户端在重连成功后,发送一个重连请求,携带之前的会话ID或用户令牌,服务端验证通过后,将客户端恢复到断开前的状态。此外,还可以使用消息队列(如Redis )来缓存离线期间未送达的消息,在客户端重连后一次性推送过去。