开始之前

命令行客户端能连接,不代表浏览器也能连接同一地址。先确认故障发生在哪个阶段,再对照 URL、网页来源和应用协议。请使用自己控制的测试服务和无敏感信息的消息。

边看边操作在 WebSocket 测试 中打开实际工作区
01

确认完整 WSS 地址

在 HTTPS 网页中连接远程服务,应使用 wss://。不安全的 ws:// 可能被混合内容策略拦截,不能据此判断服务器离线。检查域名、路径与 TLS 证书;localhost 例外和本地网络权限随浏览器而异。

示例
wss://your-test-host.example/ws
这是占位地址,请替换为自己的 WebSocket 端点。
02

连接成功后再发送消息

打开 WebSocket 在线测试工具,填写地址及服务要求的子协议,再点击连接。等待状态变为 OPEN,发送服务文档支持的最小测试消息。任意 JSON 并不适用于所有应用协议。

示例
CONNECTING → OPEN → 发送协议要求的测试消息
记录首条响应,以及连接到断开的时长。
03

检查握手失败的证据

同时查看开发者工具 Network、Console 和服务端或代理日志。401/403 可能与鉴权或 Origin 策略有关,404 可能是路径错误。HTTP/1.1 升级握手成功使用 101。页面的 error 事件无法直接暴露底层 HTTP 响应,也不能可靠地区分 DNS、TLS 或握手失败。

示例
对照:URL/路径 · Origin · Cookie · 请求的子协议
再按时间定位对应的服务端日志。
04

正确理解关闭码

1006 表示浏览器没有收到 Close 帧便观察到异常关闭。它是现象,不能直接判定为超时或鉴权失败;对端也不能在 Close 帧中发送 1006。记录是否曾进入 OPEN、持续多久,以及代理是否切断了空闲连接。

示例
1000:正常关闭
1006:异常关闭;继续检查握手与服务端/代理日志

为什么命令行能连,浏览器却不能?

浏览器 WebSocket 构造器接收 URL 和可选子协议,不提供任意请求头选项。不能像命令行那样添加 Authorization 请求头或覆盖 Origin。Cookie 鉴权还取决于服务端配置和浏览器 Cookie 策略。请遵循服务文档支持的浏览器鉴权流程,不要把生产 Token 粘贴到 URL。单独补上 CORS 响应头也不能替代 WebSocket 的 Origin 校验。

子协议不是自定义请求头

子协议只填写服务端支持的协议名称,例如应用约定的协议版本。它们会进入 Sec-WebSocket-Protocol,而不是任意请求头编辑区。协商出的协议必须匹配客户端提供的值。如果服务要求在 OPEN 后发送鉴权、订阅或心跳消息,应先遵循该协议,再判断为什么没有业务数据。

下一次测试只验证一个问题

现象下一步检查
始终没有进入 OPEN协议、证书、路由、Origin 和鉴权
OPEN 后立即断开子协议与首条业务消息
每次空闲固定时长后断开代理超时及文档要求的心跳
OPEN 但没有消息是否需要订阅、目标频道及服务端事件

官方参考

以上协议规则和浏览器 API 行为依据下列资料核对。浏览器测试工具不能绕过目标服务的鉴权或安全策略。

CODE
MDN — Browser client and secure connections
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications

MDN — WebSocket constructor and subprotocols
https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket

WHATWG — WebSockets API, handshake and browser error reporting
https://websockets.spec.whatwg.org/

RFC 6455 — Origin checks (10.2) and close codes (7.4.1)
https://www.rfc-editor.org/rfc/rfc6455.html
要点总结
  • HTTPS 页面连接远程服务优先使用 WSS。
  • 区分握手失败与业务消息不符合协议。
  • 1006 是排查起点,不能代替具体原因。
  • 浏览器请求头、Origin 和子协议协商都有明确限制。