websocket 的 onclose 事件可捕获关闭状态码(event.code)、原因(event.reason)和是否正常关闭(event.wasclean);需绑定监听器并结合三者判断断连类型,如 wasclean 为 false 且 code 为 1006 表示异常关闭。

WebSocket 的 onclose 事件处理器能捕获连接关闭时的信息,包括状态码(event.code)、原因(event.reason)和是否为正常关闭(event.wasClean)。关键在于正确绑定事件并理解各字段含义。
绑定 onclose 事件监听器
在创建 WebSocket 实例后,直接为 onclose 属性赋值一个函数即可:
const ws = new WebSocket('wss://example.com/chat');
ws.onclose = function(event) {
console.log('连接已关闭');
console.log('状态码:', event.code);
console.log('关闭原因:', event.reason);
console.log('是否正常关闭:', event.wasClean);
};
常见状态码及含义
WebSocket 关闭状态码由 IETF RFC 6455 定义,浏览器和服务器可自定义 4000–4999 范围内的应用级码。常用标准码有:
-
1000:正常关闭(如调用
ws.close()或服务端主动关闭) - 1001:终端离线(如页面卸载、浏览器关闭、网络中断)
- 1002:协议错误(收到非法帧)
- 1003:不支持的数据类型(如发送了服务端无法处理的二进制数据)
-
1006:异常关闭(无明确关闭帧,通常表示连接意外丢失,
wasClean为false) -
4001–4999:自定义业务码(需双方约定,例如
4001表示登录过期,4002表示权限不足)
区分意外断开与主动关闭
仅看 code 不够可靠,应结合 wasClean 和 reason 判断真实原因:
- 若
event.wasClean === true,说明收到了合法的关闭帧,大概率是服务端或客户端主动调用close() - 若
event.wasClean === false,且code === 1006,基本可判定为网络问题、服务宕机或客户端崩溃 - 服务端可通过
close(code, reason)主动传入自定义码和文本原因,前端可在event.reason中读取(注意长度限制,一般 ≤123 字节)
补充建议
实际使用中建议:
- 不要只依赖
onclose做重连判断——配合onerror和心跳检测更稳妥 - 避免在
onclose中立即重连,加个延迟(如 1–3 秒),防止频繁闪断导致雪崩 - 记录
code和reason到日志,便于排查线上连接异常 - 若需兼容旧写法,也可用
ws.addEventListener('close', handler),效果一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











