安全关闭 websocket 需传合法 close 参数(如 1000/1001)、确保 readystate 为 open、手动清理监听器与资源,并可结合 abortcontroller 统一管理中止逻辑。

安全关闭 WebSocket 连接,核心是“协议合规 + 资源清理 + 状态可控”。不能只调 ws.close() 就完事,否则容易触发异常关闭(code 1006)、卡在 CLOSING 状态、内存泄漏,甚至导致服务端无法识别关闭意图。
必须传合法的 close() 参数
浏览器对 ws.close(code, reason) 的参数校验极严。非法值会直接抛错,连接无法进入标准关闭流程:
-
code 必须是 16 位无符号整数,且仅限以下范围:
– 1000(正常关闭)、1001(端点离开,如页面卸载)
– 1002–1015(协议/编码错误)
– 4000–4999(应用自定义,需双方约定)
❌ 0、999、3000、5000、"1000"(字符串)、NaN 都会报错 -
reason 必须是 UTF-8 字符串,长度 ≤ 123 字节(不是字符数),不能含控制字符或敏感信息
可省略,但显式传参利于日志追踪,例如:ws.close(1000, "User logged out")
关闭前确保 readyState 是 OPEN
调用 close() 前务必检查状态,避免在 CONNECTING 或 CLOSED 时误调:
if (ws.readyState === WebSocket.OPEN) { ws.close(1000, "cleanup"); }- 微信小程序中更严格:必须等
wx.onSocketOpen触发后才能调wx.closeSocket,否则静默失败 - 不要在
onclose或onerror回调里再调close(),防止重复关闭
手动清理监听器和关联资源
WebSocket 实例不会自动解绑事件,匿名函数监听器会导致内存泄漏:
- 提前保存监听器引用,关闭时显式移除:
const onMessage = e => {...}; ws.onmessage = onMessage;
关闭时:ws.onmessage = null; - 清除所有绑定:
ws.onopen = ws.onmessage = ws.onerror = ws.onclose = null; - 停掉重连定时器、清空待发送队列、取消未完成的 Promise(如心跳超时检测)
配合 AbortController 实现统一取消信号
AbortController 不会自动关 WebSocket,但能帮你集中管理取消时机:
- 创建控制器:
const controller = new AbortController(); - 监听中止信号:
controller.signal.addEventListener("abort", () => { if (ws.readyState === WebSocket.OPEN) { ws.close(1000, "Aborted by signal"); } ws.onmessage = null; }); - 页面卸载或路由跳转时调
controller.abort(),即可触发统一清理逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











