【问题标题】:In socket.io with node.js, how can I determine the server IP of a specific connection?在带有 node.js 的 socket.io 中,如何确定特定连接的服务器 IP?
【发布时间】:2013-04-21 03:58:43
【问题描述】:

最终,这里的目标是使用 socket.io 处理 DNS 循环,以协调不同的连接(socket.io 和 jQuery ajax),以便当一个名称映射到多个服务器时它们会转到同一服务器。

使用此代码,我可以找到传入 websockets 连接的客户端端 IP 地址:

var app = express();
   ...
var server = http.createServer(app);
   ...
var io = socketio.listen(server);
io.on('connection', function(socket) {
  var addr = socket.handshake.address;
  logger.info("Just got incoming connection from client " + addr.address
              + ":" + addr.port);

但是我怎样才能找到这个套接字的服务器端IP地址呢?我想将服务器端 IP 地址发送到客户端(使用socket.emit('serverSideIp': <server-IP>)),以便出于诊断目的,我们可以跟踪正在使用的特定 IP 地址。此外,当 socket.io 连接失败并转到不同的 IP 时,我想将客户端 AJAX 请求重定向到该 IP,这样客户端就不会同时与不同的服务器通信。

编辑:Get local IP address in node.js 没有回答我的问题。 回答是,“我的 IP 地址列表是什么。”我的问题是,“给定一个特定的套接字,该特定套接字的本地地址(IP 和端口)是什么”,在多宿主主机上无法通过从操作系统获取地址列表来回答。在 Java 或 C# 中,获取套接字的本地和远程端口以及 IP 地址是微不足道的。你如何在 node.js 中为 socket.io“socket”连接做到这一点?

【问题讨论】:

  • 我不确定这是否可行,但您是否尝试过server.address()
  • server.address() 返回:{ address: '0.0.0.0', family: 'IPv4', port: 80 }
  • 更新了问题,使其更加清晰。我的问题完全不是重复的。我想知道,给定一个特定的连接(套接字),该套接字的本地地址(IP 和端口)是什么?我已经可以得到远程端的IP和端口了。

标签: node.js express websocket socket.io


【解决方案1】:

Socket.IO 正在侦听 websocket 请求,但它是在 Express 建立的 HTTP 连接上进行的。您可以找到 Express 接受 HTTP 连接的地址,如下所示:

app.get('/', function (req, res) {
    console.log(req.socket.address());

也就是说,在弄清楚接受地址之前,不要等待 websocket 请求;如果需要,可以在 Socket.IO 连接事件期间存储它以备后用。

【讨论】:

  • 这似乎不起作用。当socket.io请求进来时,'/'所附的函数不会被调用。
  • 但是在 socket.io 请求进来之前,已经建立了一个常规的 HTTP 连接,对吧?
  • 不是在故障转移时,不是。我们正在使用 DNS 循环。如果我们连接的服务器出现故障,socket.io 会重试并连接到另一个。在故障转移时,之前没有正常的 HTTP 请求。
  • 好点。好吧,我不知道是否有一种完全直接的方法可以在这里做你想做的事情,所以如果你真的不需要它,请考虑禁用重新连接:stackoverflow.com/a/11266954/4323。或者,也许您可​​以添加一个连接事件回调,该回调在每次建立连接时将客户端的 IP 发布到服务器……这不是 100% 确定的。
  • @Sentient:我找到了我的零钱。我更改了 lib/manager.js,它不再是 socket.io 的一部分,因此当调用io.on('connection' ... 事件时,socket.handshake 具有属性socket.handshake.localAddress。看起来这是在 1.0 之前完全重新实现的,所以我的解决方案不再相关。您可能希望在收到连接事件时检查socket 的属性,以查看本地套接字IP/端口是否可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2011-06-11
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多