命令行客户端能连接,不代表浏览器也能连接同一地址。先确认故障发生在哪个阶段,再对照 URL、网页来源和应用协议。请使用自己控制的测试服务和无敏感信息的消息。
确认完整 WSS 地址
在 HTTPS 网页中连接远程服务,应使用 wss://。不安全的 ws:// 可能被混合内容策略拦截,不能据此判断服务器离线。检查域名、路径与 TLS 证书;localhost 例外和本地网络权限随浏览器而异。
wss://your-test-host.example/ws
这是占位地址,请替换为自己的 WebSocket 端点。连接成功后再发送消息
打开 WebSocket 在线测试工具,填写地址及服务要求的子协议,再点击连接。等待状态变为 OPEN,发送服务文档支持的最小测试消息。任意 JSON 并不适用于所有应用协议。
CONNECTING → OPEN → 发送协议要求的测试消息
记录首条响应,以及连接到断开的时长。检查握手失败的证据
同时查看开发者工具 Network、Console 和服务端或代理日志。401/403 可能与鉴权或 Origin 策略有关,404 可能是路径错误。HTTP/1.1 升级握手成功使用 101。页面的 error 事件无法直接暴露底层 HTTP 响应,也不能可靠地区分 DNS、TLS 或握手失败。
对照:URL/路径 · Origin · Cookie · 请求的子协议
再按时间定位对应的服务端日志。正确理解关闭码
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 行为依据下列资料核对。浏览器测试工具不能绕过目标服务的鉴权或安全策略。
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 和子协议协商都有明确限制。