Connection refused错误的根本原因是目标端口无进程监听或监听地址不可达;需检查Worker进程是否运行、端口是否被占用、监听地址是否为0.0.0.0而非127.0.0.1、防火墙/安全组是否放行、客户端协议与IP配置是否匹配服务端。

Workerman主动推送信息时抛出Connection refused错误,说明客户端尝试连接服务端监听的地址和端口时被直接拒绝,根本原因在于目标端口上没有进程在监听,或监听地址不可达。这不是网络延迟问题,而是连接请求连服务端的“门”都没摸到。
确认服务端Worker进程是否真正运行
执行 php start.php status 或 ps aux | grep Worker 查看进程是否存在。如果只看到启动命令但无实际worker进程,说明启动失败或被自动退出。
检查 workerman.log(通常位于项目根目录或 storage/logs/ 下),重点查找类似 stream_socket_server(): unable to connect to tcp://0.0.0.0:2346 (Address already in use) 的报错——这表示端口已被占用,新进程无法绑定,导致后续推送连接全部失败。
若日志中出现 Permission denied,说明你正尝试绑定小于1024的端口(如80、443)且未用root权限启动。Workerman默认不允许非root用户绑定特权端口。
验证监听地址与端口是否对外可达
在服务端机器上执行:netstat -tlnp | grep :2346(将2346替换为你实际使用的端口),确认输出中包含 LISTEN 状态且监听地址为 0.0.0.0:2346 或具体公网IP,而非仅 127.0.0.1:2346。
如果监听地址是 127.0.0.1,则仅限本机访问;远程客户端推送时必然报Connection refused。必须改为 0.0.0.0 或服务器真实外网IP。
使用 telnet 服务器IP 端口号 从客户端机器测试连通性。若提示 Connection refused,而服务端确认进程存在、监听地址正确,则一定是防火墙或安全组拦截。
放行防火墙与云平台安全组
方法一:宝塔面板用户 → 安全 → 放行对应端口(如2346)→ 提交。
方法二:CentOS 7+ 命令行:firewall-cmd --permanent --add-port=2346/tcp && firewall-cmd --reload。
方法三:云服务器(阿里云/腾讯云等)→ 控制台 → 安全组 → 入方向规则 → 添加一条允许TCP协议、端口2346、源IP为0.0.0.0/0(或限定IP段)的规则。
【务必检查安全组是否绑定到对应ECS实例】,常见错误是规则添加了,但没应用到实际运行的服务器上。
检查客户端连接配置是否匹配服务端协议
第一步:确认服务端启动的是WebSocket服务还是纯TCP服务。若代码中使用 new WebsocketWorker('websocket://0.0.0.0:2346'),则客户端必须用 ws:// 协议连接;若用 new Worker('tcp://0.0.0.0:2346'),客户端必须用 tcp:// 或原始socket连接。
第二步:检查客户端URL中的域名/IP是否解析正确。用 ping your-domain.com 和 nslookup your-domain.com 验证DNS指向的服务端真实IP,避免因CDN、hosts误配导致连错机器。
第三步:若服务端监听 0.0.0.0:2346,客户端却写成 127.0.0.1:2346,则仅当客户端与服务端在同一台机器时才可能成功;跨机器推送必须用服务端外网IP或可解析的域名。

















