You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用WebSocket.close(3000)为何返回1000状态码?

问题原因及解决方法

为什么自定义状态码3000不生效?

WebSocket的关闭状态码受RFC 6455标准严格限制:

  • 客户端主动调用close()时,仅能使用浏览器允许的特定状态码,包括1000、1001、1002、1003、1007-1011、1015。
  • 3000-3999属于「应用保留状态码范围」,这个范围的状态码仅允许服务器发送给客户端。客户端尝试发送这类状态码时,浏览器会自动替换为默认的1000(正常关闭)状态码,所以你的onclose事件里只能拿到1000。

如何模拟自定义状态码的关闭?

如果你需要测试客户端对非1000状态码的处理,有两种方案:

  1. 使用客户端允许的状态码:比如换成1001(端点即将离开)、1002(协议错误)等,这些状态码能被浏览器正常发送,onclose事件会正确返回对应的码。
  2. 手动触发自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:23:19