【问题标题】:Socket.io-client connecting to multiple serversSocket.io-client 连接到多个服务器
【发布时间】:2014-03-29 04:34:51
【问题描述】:

我正在尝试使用 socket.io 和 socket.io-client 节点模块,使用以下代码从一台服务器(作为主服务器)连接到另外 2 台服务器(作为从服务器,两者具有相同的代码):

var ioClient = require('socket.io-client');
var hosts = require('./hosts');
var x = {}
for (var i in hosts.get) {
  var name = 'ns' + i;
  x[name] = ioClient.connect(hosts.get[i].url, { 'force new connection':true });
  x[name].on('connect', function() {
    console.log(x[name].socket.options.host + ' connected')
  });
}

如您所见,我正在尝试连接到 X 个不同的服务器(在文件 hosts.js 中定义)并将每个套接字存储在一个对象中。

问题是,尽管我能够连接,但所有套接字似乎都来自最后一个主机,所以我最终是这样的:

host2.pc.gg.edu connected
host2.pc.gg.edu connected

当期望值为:

host1.pc.gg.edu connected
host2.pc.gg.edu connected

我试过断开host1,然后输出结果是这样的:

host2.pc.gg.edu connected

所以我认为问题是套接字没有正确建立字段“options.host”

有趣的部分来自于我执行相同的代码,但不是在对象中使用变量键,而是使用 eval:

var ioClient = require('socket.io-client');
var hosts = require('./hosts');
var x = {};
for (var i in hosts.get) {
    eval('x.ns' + i + '= ioClient.connect(hosts.get[' + i + '].url, { "force new connection":true });x.ns' + i + '.on("connect", function() {console.log(x.ns' + i + '.socket.options.host + " connected")});');
}

令人惊讶的是,这很有效,我无法区分这两个代码之间的区别。我确信这可能更多是 JavaScript 错误而不是 socket.io 错误,但经过数小时的尝试后我无法找到解决方案......

非常感谢

【问题讨论】:

    标签: javascript node.js socket.io eval


    【解决方案1】:

    套接字连接正常,问题在于连接回调。更具体地说,在实际调用回调时,for 循环已经完成,变量i 和随后的变量name 将指向最后一个元素。您可以通过在循环的每次迭代周围创建一个闭包来解决此问题,从而将 i 的当前值保留在回调范围内。

    for (var i in hosts.get) {
        var name = 'ns' + i;
        (function (name) {
            x[name] = ioClient.connect(hosts.get[i].url, { 'force new connection':true });
            x[name].on('connect', function () {
                console.log(x[name].socket.options.host + ' connected')
            });
        })(name);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-31
      • 2015-05-20
      • 1970-01-01
      • 2018-03-14
      • 2016-05-12
      • 2015-11-12
      • 2021-04-21
      • 2020-05-11
      • 1970-01-01
      相关资源
      最近更新 更多