websocket断开需结合onclose监听、readystate校验和心跳探测:onclose获取code/reason决定重连或跳转;发送前必查readystate;心跳包+超时机制捕获静默断开;close()应显式传参且避免重复调用。

WebSocket 连接关闭和断开是前端实时通信中必须妥善处理的关键环节。不能只依赖 socket.close() 主动调用,更要预判异常断开、网络中断、服务不可用等被动场景,通过状态检查 + 事件监听 + 重连策略三者结合来保障健壮性。
监听 onclose 事件获取关闭详情
每次连接结束(无论主动还是被动),都会触发 onclose 事件。它携带两个关键字段,可用于归因分析:
-
event.code:标准关闭码(如
1000表示正常关闭,1006表示异常关闭,4001–4999是自定义业务码) -
event.reason:服务器传来的关闭原因字符串,比如
"token_expired"或"user_logout"
建议在 onclose 中打印日志,并根据 code/reason 决定是否自动重连或跳转登录页。
用 readyState 防止无效发送
socket.readyState 是判断当前连接是否可用的唯一可靠依据。发送前必须校验:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
WebSocket.OPEN (1)→ 可安全调用send() -
WebSocket.CONNECTING (0)或CLOSING (2)→ 应缓存消息或丢弃 -
CLOSED (3)→ 不再尝试发送,应进入重连逻辑
注意:onerror 不代表断开,它只反映某次操作失败(如 send 时连接已实际中断但 readyState 还未更新),所以不能仅靠它触发重连。
捕获真实断开:结合 onerror + 定时心跳探测
有些断开不会立刻触发 onclose(例如 NAT 超时、静默掉线),此时需主动探测:
- 建立连接后,启动定时器每 20–30 秒发一次心跳包(如
socket.send(JSON.stringify({ type: 'ping' }))) - 设置响应超时(如 5 秒),若未收到
pong回复,则认为连接失效,手动调用socket.close()并触发重连 - 在
onerror中不直接重连,而是标记“疑似异常”,等待下一次心跳失败后再执行
主动关闭连接的正确姿势
调用 socket.close(code, reason) 是干净退出的方式:
- 推荐显式传参,如
socket.close(1000, "user_logout"),便于后端审计 - 关闭后不要立即销毁 socket 实例,可保留引用用于重连或状态回溯
- 避免在
onclose中再次调用close(),防止重复触发或报错
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










