WebSocket主动关闭需调用close(code,reason)并传入1000–4999状态码,异常断开则通过onclose中wasClean与code综合判断:wasClean为false或code=1006即属异常,需指数退避重连。

WebSocket 的 close() 方法用于主动关闭连接,而连接异常断开(如网络中断、服务端崩溃)则会触发 onerror 或直接进入 onclose 且 event.code 非正常(如 1006)。关键在于:主动关闭应传入合法状态码(1000–4999)并监听 onclose;异常断开无法通过 close() 触发,需依赖 onerror 和 onclose 中的状态码与事件属性综合判断。
主动关闭 WebSocket 并传入自定义状态码
调用 ws.close(code, reason) 可发起标准关闭握手。状态码必须是 1000–4999 范围内的整数(1000 表示“正常关闭”,1001 表示“离开”,1002 表示“协议错误”等),reason 是可选的 UTF-8 字符串(长度 ≤123 字节)。
- 只传状态码:
ws.close(1000)—— 服务端会收到标准关闭帧 - 传码+原因:
ws.close(4001, "Token expired")—— 原因会被服务端读取(需服务端支持解析) - 不传参数:
ws.close()等价于ws.close(1005)(“未指定状态码”),但部分浏览器可能实际发送1000
在 onclose 中根据 code 和 wasClean 区分关闭类型
onclose 事件对象包含两个关键属性:code(服务器或本地返回的状态码)和 wasClean(布尔值,表示是否完成关闭握手)。二者结合才能可靠判断断开性质:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
-
event.wasClean === true && event.code === 1000→ 正常主动关闭(如用户退出、页面卸载前调用close()) -
event.wasClean === true && event.code >= 4000→ 应用层自定义关闭(如权限失效、业务超时),适合前端记录日志或跳转登录页 -
event.wasClean === false→ 异常断开:可能是网络中断、DNS 失败、服务端强制终止、心跳超时未响应等,此时code常为1006(“连接异常关闭”)或0(某些浏览器未设置码)
配合 onerror 和 readyState 提升容错能力
onerror 在连接建立失败或传输中发生底层错误时触发(如 TLS 握手失败、帧解析错误),但它**不保证一定先于 onclose**,且不携带状态码。因此不能单独依赖它判断断开原因:
立即学习“前端免费学习笔记(深入)”;
- 在
onerror中仅做轻量处理:标记错误状态、记录控制台警告,避免重连逻辑 - 重连决策应统一放在
onclose中,结合wasClean和code判断是否需要重试 - 检查
ws.readyState:若为WebSocket.CLOSED(0)或WebSocket.CLOSING(2),说明已不可用;若仍为CONNECTING(0)或OPEN(1),则onerror可能是临时传输扰动
常见状态码参考与业务建议
除标准 RFC 6455 码外,应用可安全使用 4000–4999 自定义码(服务端需兼容解析):
- 1000:用户主动登出、页面关闭前清理 → 清空本地缓存,不自动重连
- 1001:服务端停机或维护 → 显示“系统维护中”,延迟重试或提示稍后访问
- 1006:客户端无法判断原因的异常断开 → 启动指数退避重连(如 1s→2s→4s)
- 4001:token 过期 → 跳转登录页,清除 auth token
- 4003:账号在别处登录 → 弹窗提示并禁止后续操作


















