调用WebSocket.close(3000)为何返回1000状态码?
问题原因及解决方法
为什么自定义状态码3000不生效?
WebSocket的关闭状态码受RFC 6455标准严格限制:
- 客户端主动调用
close()时,仅能使用浏览器允许的特定状态码,包括1000、1001、1002、1003、1007-1011、1015。 - 3000-3999属于「应用保留状态码范围」,这个范围的状态码仅允许服务器发送给客户端。客户端尝试发送这类状态码时,浏览器会自动替换为默认的1000(正常关闭)状态码,所以你的
onclose事件里只能拿到1000。
如何模拟自定义状态码的关闭?
如果你需要测试客户端对非1000状态码的处理,有两种方案:
- 使用客户端允许的状态码:比如换成1001(端点即将离开)、1002(协议错误)等,这些状态码能被浏览器正常发送,
onclose事件会正确返回对应的码。 - 手动触发自定义CloseEvent:如果一定要用3000这类状态码,可以直接给WebSocket对象分发自定义事件,无需依赖浏览器的关闭逻辑:
// 修改原脚本的setTimeout部分 setTimeout(() => { const targetSocket = sockets.filter(ws => ws.url.includes("mysocket"))[0]; if (targetSocket) { // 构造自定义关闭事件 const customCloseEvent = new CloseEvent('close', { code: 3000, reason: 'force close', wasClean: false // 标记为非干净关闭,模拟意外断开 }); // 触发事件 targetSocket.dispatchEvent(customCloseEvent); // 可选:实际关闭连接(如果需要断开真实连接) targetSocket.close(); } }, 5000);
这样你的onclose监听就能捕获到3000状态码,完美模拟意外关闭的场景。
内容的提问来源于stack exchange,提问作者Patrick Michaelsen
相关产品推荐
相关产品推荐

