You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:00:57