我有一个这样的数组:
var exports = module.exports = {};
var net = require('net');
exports.config = [
{
ip: "127.0.0.1",
id: 1,
socket: new net.Socket(),
data: "",
},
{
ip: "192.168.5.242",
id: 2,
socket: new net.Socket(),
data: "",
}
];
我正在尝试使用此代码将每个项目与 TCP 套接字连接:
for(var key in tornelli.config) {
tornelli.config[key].socket.connect(4000, tornelli.config[key].ip, function() {
console.log('CONNECTED TO: '+tornelli.config[key].ip);
});
tornelli.config[key].socket.on('data', function(data) {
...........
});
tornelli.config[key].socket.on('error', function(error){
console.log(error);
});
}
但是有些地方出了问题,因为在控制台输出中我得到了
CONNECTED TO: 192.168.5.242
但实际上我连接的是“127.0.0.1”。好像我没有把每个tcp流分开。我怎样才能有两个单独的 tcp 流,一个数组中的每一项?
是关于异步执行的吗?
谢谢
最佳答案
在 Javascript 中,for
循环不是“ block ”。如果你愿意,你可以把 var
放在那里,但它仍然会被“提升”到你的函数的顶部。在您的初始函数调用中一切都很好 - key
将为 0,然后为 1,循环将运行两次。但是当执行 CALLBACKS 时,key
将始终为 1 - 它的最后一个值。回调是异步的,因此它们将在 for
循环完成它的工作后很好地触发。
Javascript 有一个 forEach
运算符,可以使这样的任务变得更简单。尝试以下操作(或者简单地将您的套接字处理代码分解为一个将配置 block 作为参数的函数):
tornelli.config.forEach(function(config) {
config.socket.connect(4000, config.ip, function() {
console.log('CONNECTED TO: '+config.ip);
});
config.socket.on('data', function(data) {
...........
});
config.socket.on('error', function(error){
console.log(error);
});
}
就其值(value)而言,在配置文件中预先创建诸如套接字之类的东西也很不寻常。一个更标准的模式是在上面的代码中调用 new net.Socket()
,而不是在配置文件中。
关于node.js - 管理多个 TCP 套接字 nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37418502/