WebSocket.Server调用address()返回"::" 如何获取正确本地IPv4地址
问题根因
server.address()返回::是Node.js(含Electron内置Node运行时)的默认行为:启动TCP/WebSocket服务时如果未手动指定绑定的host参数,会默认绑定IPv6双栈通配地址::,该地址代表同时监听本机所有IPv4、IPv6网卡接口,本身不属于某一块物理网卡的实际IP,因此不会返回ipconfig中展示的具体局域网IPv4地址(如192.168.0.41)。
该表现和是否等待服务启动完成后再调用address()方法无关,ws库、原生net模块的服务都遵循这个逻辑。
可行方案
方案1:强制服务仅监听IPv4栈
启动服务时手动指定host为IPv4通配地址0.0.0.0,此时address()返回的地址字段会变为0.0.0.0,代表服务已绑定所有IPv4网卡:
- ws服务写法
wss = new WebSocket.Server({ port: 6000, host: '0.0.0.0' }) wss.on('listening', () => { console.log(wss.address()) // address字段返回'0.0.0.0' })
- 原生net服务写法
const net = require("node:net") const s = net.createServer((socket) => {}) s.listen(6000, '0.0.0.0', () => { console.log("opened server on: ", s.address()) })
注意:
0.0.0.0是通配监听地址,不是你设备的实际局域网IP,要获取ipconfig展示的具体网卡IP,参考方案2。
方案2:直接读取系统网卡信息获取真实IPv4地址
不需要执行ipconfig命令,用Node.js内置os模块枚举本机所有网卡,过滤回环地址、虚拟网卡地址后即可拿到和ipconfig输出一致的IPv4地址,和服务绑定的地址类型无关:
const os = require('node:os') function getLocalIPv4() { const ifaces = os.networkInterfaces() for (const name of Object.keys(ifaces)) { for (const iface of ifaces[name]) { // 筛选IPv4协议、非内部回环/虚拟地址 if (iface.family === 'IPv4' && !iface.internal) { return iface.address } } } return '127.0.0.1' } // 调用示例 const deviceIP = getLocalIPv4() // 返回值类似192.168.0.41,和ipconfig结果一致
如果设备同时接入多块物理网卡(如同时连接有线网、WiFi),可根据业务需求增加网卡名过滤规则,返回指定网卡对应的IP。
内容的提问来源于stack exchange,提问作者Marko Ranković
相关产品推荐
相关产品推荐

