WebSocket断连时关键在于客户端感知、归因与平滑恢复:通过close事件+自定义状态码(如4001)区分维护与故障,结合HTTP健康接口轮询、指数退避重连、本地消息缓存及用户提示降级,实现优雅体验。
WebSocket 在服务器维护期间断连时,关键不是“避免断开”,而是让客户端感知断连、区分原因、合理重连,并在恢复后平滑续传。核心在于结合 close 事件、自定义状态码、心跳机制与退避重连策略。
服务器主动关闭连接时,应使用 WebSocket 规范中保留的、服务端可自定义的状态码(如 4000–4999)传递语义信息。例如,维护中发送 close(4001, "maintenance")。
客户端需在 onclose 中检查 event.code 和 event.reason:
code === 4001 或 reason.includes("maintenance"),标记为“计划性维护”,暂停自动重连或延长重试间隔code === 1006(异常关闭)或超时无响应,则按网络故障处理,启用快速重试event.wasClean === false 判断——它无法区分宕机和主动维护单纯靠 WebSocket 连接状态不足以判断服务是否就绪。应在维护前/中提供轻量 HTTP 接口(如 /api/v1/status),返回 JSON:
立即学习“前端免费学习笔记(深入)”;
{ "status": "maintenance", "until": "2025-04-12T14:30:00Z", "message": "系统升级中" }
客户端可在检测到断连后,立即轮询该接口:
status: "ok" → 尝试重建 WebSocketstatus: "maintenance" → 显示提示、禁用交互、定时轮询(如每 30 秒一次)维护期间不盲目重连,但需在恢复后快速重建并续传未确认消息:
{"type":"resync","seq":123}),服务端据此补推丢失事件或确认已收消息优雅不只体现在代码逻辑,更体现在用户感知: