Socket.io-client连接到多个服务器

时间:2014-03-28 13:09:35

标签: javascript node.js socket.io eval

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

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

所以我认为问题是socket没有正确建立字段“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错误,但是经过几个小时的努力后我无法找到解决方案......

非常感谢

1 个答案:

答案 0 :(得分:3)

套接字连接正常,问题在于连接回调。更具体地说,到实际调用回调时,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);
}