← 免费工具

WebSocket 关闭码与 Pusher 错误码

每个代码的含义和处理方法:标准 WebSocket 关闭码(1000–1015),以及 Pusher 协议的错误码(4000–4399),Hibira 和其他兼容 Pusher 的服务也会发送这些代码。

Pusher 协议代码

Pusher 服务器会先发送带有代码和原因的 pusher:error 消息,再用同一个代码关闭连接。代码所在的范围决定客户端下一步怎么做。

  • 4000 SSL only

    这个应用只接受加密连接。

    怎么处理: 用 wss:// 连接(pusher-js 设置 forceTLS: true)。

    不会用相同设置重新连接
  • 4001 Application does not exist

    这个主机上没有使用该 Key 的应用。

    怎么处理: 检查 App Key 和主机(或 cluster):一个服务或区域的 Key 不能用在另一个上。

    不会用相同设置重新连接
  • 4003 Application disabled

    应用存在,但已停用。

    怎么处理: 在应用的管理页重新启用,或检查账号的账单状态。

    不会用相同设置重新连接
  • 4004 Over connection quota

    应用打开的连接数已达到套餐上限。

    怎么处理: 等待其他连接关闭、关掉不需要的标签页,或升级到连接数更多的套餐。

    不会用相同设置重新连接
  • 4005 Path not found

    URL 路径不是 /app/APP_KEY。

    怎么处理: 检查 WebSocket 路径:代理和错误的 wsPath 设置经常导致这个问题。

    不会用相同设置重新连接
  • 4006 Invalid version string format

    客户端发送的版本服务器无法识别。

    怎么处理: 使用官方客户端库,或在 URL 中加上 protocol=7。

    不会用相同设置重新连接
  • 4007 Unsupported protocol version

    服务器不支持客户端请求的协议版本。

    怎么处理: 更新客户端库;当前协议版本是 7。

    不会用相同设置重新连接
  • 4008 No protocol version supplied

    URL 中没有 protocol 参数。

    怎么处理: 在 URL 中加上 ?protocol=7,或使用官方客户端库。

    不会用相同设置重新连接
  • 4009 Connection is unauthorized

    服务器拒绝了这个连接:在 Hibira 上最常见的原因是页面的来源不在允许列表中。

    怎么处理: 把网站的来源(协议、主机和端口)加入应用的允许来源。关闭前的 pusher:error 消息会说明是哪项检查没有通过。

    不会用相同设置重新连接
  • 4100 Over capacity

    服务器繁忙,或同一个地址同时发起了太多连接。

    怎么处理: 大多数情况下无需处理:客户端会退避后重试。如果一直出现,请把重连时间错开,不要让所有客户端同时重连。

    会退避后重新连接
  • 4200 Generic reconnect immediately

    服务器要求客户端重新连接,例如服务器正在重启。

    怎么处理: 无需处理:客户端会立即重新连接。

    会立即重新连接
  • 4201 Pong reply not received

    服务器发送了 ping,但没有及时收到 pong。

    怎么处理: 通常是标签页进入休眠或移动网络不稳定。如果是自己写的客户端,收到 pusher:ping 要回复 pusher:pong。

    会立即重新连接
  • 4202 Closed after inactivity

    连接空闲太久。

    怎么处理: 无需处理:客户端会重新连接。让客户端的 activity timeout 短于服务器的。

    会立即重新连接
  • 4301 Client event rejected due to rate limit

    这个连接发送客户端事件太多太快,其中一个被丢弃(在 Hibira 上也可能是每日消息额度用完了)。连接保持打开。

    怎么处理: 降低每秒发送的客户端事件数,例如对正在输入或光标事件做节流。

    连接保持打开

标准 WebSocket 代码

这些代码来自 WebSocket 标准(RFC 6455),适用于所有 WebSocket 服务器。

  • 1000 Normal Closure

    连接是主动关闭的,工作已完成。

    怎么处理: 无需处理。

  • 1001 Going Away

    页面被关闭或刷新,或服务器正在关闭。

    怎么处理: 无需处理;页面或服务器恢复后再重新连接。

  • 1002 Protocol Error

    其中一方发送的帧违反了 WebSocket 协议。

    怎么处理: 检查是否有代理改写流量,或客户端和服务器的库不兼容。

  • 1003 Unsupported Data

    收到对方无法接受的消息类型,例如向只接收文本的服务器发送二进制数据。

    怎么处理: 发送服务器期望的类型(Pusher 服务器接收 JSON 文本)。

  • 1005 No Status Received

    关闭帧中没有代码。这是浏览器报告的状态,不会被实际发送。

    怎么处理: 单看这个代码无法判断原因;请查看服务器关闭连接时的日志。

  • 1006 Abnormal Closure

    连接在没有关闭帧的情况下断开:网络、TLS、代理或服务器结束了连接。这是浏览器报告的状态,不会被实际发送。

    怎么处理: 检查主机和端口、wss:// 与 ws:// 是否用对、证书,以及代理或负载均衡器的空闲超时(心跳间隔要短于它们切断空闲连接的时间)。在浏览器中,控制台通常会显示原因。

  • 1007 Invalid Frame Payload Data

    文本消息不是有效的 UTF-8。

    怎么处理: 用 UTF-8 编码文本,或改用二进制发送。

  • 1008 Policy Violation

    服务器根据自己的规则(例如认证或来源检查)拒绝了消息或连接。

    怎么处理: 检查服务器的规则和它给出的关闭原因。

  • 1009 Message Too Big

    消息超过了对方能接受的大小。

    怎么处理: 发送更小的消息,或把大消息拆分。

  • 1010 Mandatory Extension

    客户端需要的扩展服务器没有同意。

    怎么处理: 在客户端关闭这个扩展,或在服务器启用它。

  • 1011 Internal Error

    服务器遇到了意外错误。

    怎么处理: 检查服务器日志;以退避方式重新连接。

  • 1012 Service Restart

    服务器正在重启。

    怎么处理: 等待一小段随机时间后重新连接。

  • 1013 Try Again Later

    服务器当前负载过高。

    怎么处理: 以退避方式重新连接。

  • 1014 Bad Gateway

    网关或代理从后端服务器收到了错误的响应。

    怎么处理: 检查代理后面的服务器。

  • 1015 TLS Handshake

    TLS 握手失败,例如客户端不信任服务器的证书。这是浏览器报告的状态,不会被实际发送。

    怎么处理: 检查证书链、证书上的主机名和到期日期。

代码范围

  • 1000–2999:保留给 WebSocket 标准;这个代码尚未分配。
  • 3000–3999:供库和框架注册使用;请查阅你所用的那个。
  • 4000–4099:Pusher 错误,客户端不会用相同设置重新连接。
  • 4100–4199:Pusher 错误,客户端会退避后重新连接。
  • 4200–4299:Pusher 错误,客户端会立即重新连接。
  • 4300–4399:Pusher 错误,连接保持打开。
  • 4000–4999:私有用途,含义由发送它的应用或服务决定。

订阅错误

私有或 presence 频道订阅失败时不会关闭连接,客户端会收到 pusher:subscription_error。其中的 AuthError 几乎都是授权接口返回的签名对不上:Secret、socket ID、频道名称或 channel_data 与签名时使用的不一致。

检查签名

用 WebSocket 测试工具测试连接 → · 消息大小和其他限制 →