You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Node.js WebSocket服务器无法接收客户端连接的问题排查求助

Node.js WebSocket服务器无法接收客户端连接的问题排查求助

Hey Chris,看了你的问题描述和代码,我发现几个可能导致连接失败的关键点,咱们一步步来梳理:

1. WebSocketServer配置的冲突问题(核心原因)

你在创建WebSocketServer的时候同时指定了serverhost参数,这是个错误的用法!

当你通过server参数把WebSocket服务器挂载到已有的HTTP服务器上时,ws库会自动复用这个HTTP服务器的监听地址和端口,不需要再额外指定hostport。同时设置这两个参数会让ws库忽略你传入的HTTP服务器,自己创建一个新的监听实例,导致WebSocket和HTTP服务器使用不同的端口(就像你日志里显示的,HTTP在3000,WebSocket在8081)。这会导致外部客户端要么连错端口,要么8081端口没正确对外开放,自然连不上。

修复方法:移除host参数,只保留serverclientTracking

var wss = new WebSocketServer({ 
    server: server,  
    clientTracking: true
});

2. 代码里的两个小bug(虽不直接导致连接失败,但会引发后续问题)

  • 未引入WebSocket常量:你在判断client.readyState === WebSocket.OPEN的时候,代码里只引入了WebSocketServer,没引入WebSocket,这会导致运行时报错。需要修改引入语句:
    var { WebSocketServer, WebSocket } = require('ws');
    
  • 广播逻辑的变量错误ws !== client里的ws根本没定义,应该改成socket !== client
    if (client.readyState === WebSocket.OPEN && socket !== client) {
        client.send(message, { binary: isBinary });
    }
    

3. 关于地址显示为::的问题

日志里的::是IPv6的通配地址,意味着服务器监听所有IPv6地址,同时现代系统一般会自动兼容IPv4连接。但如果你的服务器网络环境对IPv6支持不好,或者客户端都是用IPv4连接,可以强制HTTP服务器绑定到IPv4的通配地址0.0.0.0,这样WebSocket也会跟着绑定:

server.listen(port, '0.0.0.0', () => {
    console.log("HTTP/S server listening on port: " + port);
});

修改后日志里的地址会变成0.0.0.0,更直观。

4. 客户端连接地址的正确格式

修复完代码后,客户端需要使用和HTTP服务器相同的端口来连接:

  • 如果你的网站用HTTPS(生产环境):wss://openheroodyssey.com:<你的端口>(端口是443的话可以省略)
  • 如果是HTTP(开发环境):ws://openheroodyssey.com:<你的端口>(端口是80的话可以省略)
    注意要确保:
  • 域名正确解析到服务器的公网IP
  • 该端口在服务器防火墙、云服务商安全组里都已开放

最后验证步骤

  1. 修复代码后重启服务器,确认日志里HTTP和WebSocket服务器监听的是同一个端口,地址显示为0.0.0.0::
  2. 先在本地用ws://localhost:<端口>测试连接,确保本地能连上,再测试公网地址

这样应该就能解决连接问题了,祝你顺利!

备注:内容来源于stack exchange,提问作者Chris

火山引擎 最新活动