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 与签名时使用的不一致。