Node.js使用ws包连接同内网WebSocket服务器报ECONNRESET错误如何解决
可能原因及排查方案
1. 请求头校验不通过
大多数WebSocket服务端会对握手请求的Origin、User-Agent等Header做校验,浏览器发起请求时会自动携带符合服务端要求的Header,而ws库默认发起的请求不会附带这些浏览器标识,服务端识别到异常请求会直接断开连接,触发ECONNRESET报错。
修复方式:初始化WebSocket实例时补充模拟浏览器的请求头:
const ws = new WebSocket('ws://192.168.1.111:9000', { headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Origin': 'http://192.168.1.111:9000' // 替换为浏览器连接该服务时实际携带的Origin值即可 } });
2. 代理配置干扰
Node.js环境会默认读取系统的HTTP_PROXY、HTTPS_PROXY代理环境变量,ws库发起请求时会自动走代理,内网地址走外部代理会导致连接异常断开。
排查方式:运行脚本前先清空代理环境变量后重试:
- Linux/macOS终端执行:
unset HTTP_PROXY HTTPS_PROXY NO_PROXY && node 你的脚本文件名.js
- Windows cmd执行:
set HTTP_PROXY= set HTTPS_PROXY= node 你的脚本文件名.js
3. IPv6优先级问题
Node.js v16默认会优先尝试IPv6解析,部分内网环境对IPv6支持不完善会导致连接失败,可以强制指定使用IPv4协议连接:
const ws = new WebSocket('ws://192.168.1.111:9000', { family: 4 });
4. 抓包定位差异
如果上述方案都无效,可以通过Wireshark/tcpdump分别抓取浏览器成功连接、ws库连接失败的两次握手请求包,对比请求内容的差异,就能快速定位服务端拒连的具体原因。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

