workerman websocket服务端监听地址必须显式使用websocket://协议前缀,如websocket://0.0.0.0:2346或websocket://[::]:2346;写成ws://、省略协议或ipv6地址未加方括号均导致启动失败或客户端无法连接。

Workerman WebSocket 服务端监听地址写法直接影响客户端能否连上,尤其在公网、IPv6、Docker 或反向代理场景下,错一个字符就连接失败。
监听地址必须带协议前缀 websocket://
Workerman 初始化 Worker 实例时,$socket 参数不是随便填个 IP+端口就行。它必须是完整 URL 格式,且协议只能是 websocket://(非 ws:// 或 http://):
-
websocket://0.0.0.0:2346✅ 正确:监听所有 IPv4 地址 -
websocket://127.0.0.1:2346✅ 正确:仅本机可连(适合开发) -
websocket://[::]:2346✅ 正确:监听所有 IPv4 和 IPv6 地址(注意方括号) -
ws://0.0.0.0:2346❌ 错误:Workerman 不识别ws://协议前缀,启动直接报错 -
2346或0.0.0.0:2346❌ 错误:缺少协议,Worker 构造失败
常见错误现象:Fatal error: Uncaught InvalidArgumentException: Unsupported protocol —— 就是因为写了 ws:// 或漏了协议。
IPv6 地址必须用方括号包裹
如果服务器启用了 IPv6,且你想让客户端通过 IPv6 连接(比如 ws://[2001:db8::1]:2346),服务端监听必须显式写成 websocket://[::]:2346,不能省略方括号:
-
websocket://[::1]:2346→ 仅本地 IPv6 回环 -
websocket://[::]:2346→ 所有 IPv6 接口(含公网 IPv6 地址) -
websocket://:::2346❌ 启动失败,PHP 解析器会把::当作非法端口
验证是否生效:启动后查日志,应看到类似 Websocket listening at websocket://[::]:2346,而不是只显示 0.0.0.0:2346 —— 后者说明 IPv6 实际未启用。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
客户端连接地址 ≠ 服务端监听地址
客户端 JS 使用 new WebSocket() 时填的地址,和服务端 Worker 构造参数无关,但必须匹配网络可达路径:
- 直连场景:服务端监听
websocket://0.0.0.0:2346,客户端可写ws://your-server-ip:2346 - Nginx 反代 WSS:服务端仍监听
websocket://127.0.0.1:8282(内网),客户端必须用wss://domain.com/wss,且 Nginx 配置中proxy_pass必须指向该内网地址 - Docker 环境:宿主机想连容器内 Workerman,监听地址得是
websocket://0.0.0.0:2346,同时docker run要加-p 2346:2346,不能只暴露端口不监听全网
容易被忽略的点:Nginx 代理 WSS 时,proxy_set_header Upgrade $http_upgrade 和 Connection "upgrade" 缺一不可,否则握手阶段就断开,浏览器控制台报 WebSocket connection to 'wss://...' failed。
ThinkPHP 集成时的 $socket 属性写法
在 ThinkPHP + think-worker 扩展中,Server 子类里的 $socket 属性同样要遵守协议规则:
protected $socket = 'websocket://0.0.0.0:2346'; // ✅ protected $socket = 'ws://0.0.0.0:2346'; // ❌ 启动报错
另外注意:TP5/TP6 的 server.php 入口文件里不能改这个值,它只读取 Controller 中定义的 $socket;改了入口文件里的配置反而无效。
最常踩的坑其实是把服务端监听地址和服务端部署位置混为一谈——监听 [::]:2346 不代表客户端就能直接 ws://[2001:db8::1]:2346 连上,中间防火墙、运营商 NAT、CDN 是否透传 WebSocket Upgrade 请求,才是真正决定连不连得上的关键。









