2014-03-28 147 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

相關問題