node.js - 管理多个 TCP 套接字 nodejs

标签 node.js sockets tcp socket.io

我有一个这样的数组:

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/

相关文章:

node.js - Google Cloud Datastore 如何在本地运行?

Python 3 - 带有 select.select() 的套接字 - 检测连接丢失

c - 将可变数量的参数传递给 C 函数

docker - curl卡在docker中,但不在主机上

java - 连接短时间中断后 TCP 连接被拒绝

javascript - 什么是 node.js 模块?

node.js - 调试 mocha 测试的阻力最小的途径是什么?

javascript - 检测原始数据的变化

java - 如何在两个客户端之间共享套接字单连接?

tcp - TCP段如何划分?