2014-03-28 143 views
1

我试图从一个服务器(用作主机)连接到另一个服务器2使用socket.io和socket.io-(作为从机,两者都具有相同的码)客户端节点模块,使用下面的代码:Socket.io-客户端连接到多个服务器

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 

我试过断开主机1,然后输出最终是这样的:

host2.pc.gg.edu connected 

所以我asume问题为t他没有插座正确建立现场“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错误,但我没能找到的努力小时后的解决方案......

非常感谢您

回答

2

的插座连接很好,问题在于连接回调。更具体地说,由回调实际上是调用的时候,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); 
} 
+0

工程就像一个魅力,非常感谢你!!!! – Cea33

相关问题