Javascript Socket.io客户端连接到多个服务器
我正在尝试使用socket.io和socket.io-client节点模块,使用以下代码,从一台服务器(作为主服务器)连接到另两台服务器(作为从属服务器,两者具有相同的代码):Javascript Socket.io客户端连接到多个服务器,javascript,node.js,socket.io,eval,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.con
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错误,但经过数小时的尝试,我无法找到解决方案
非常感谢套接字连接正常,问题在于on connect回调。更具体地说,在实际调用回调时,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);
}