【问题标题】:Node.js Net Sockets: Can't connect to multiple IP'sNode.js 网络套接字:无法连接到多个 IP
【发布时间】:2017-09-19 15:07:52
【问题描述】:

我想从 2 个不同的 IP 地址读取数据。但我总是收到“EALREADY”错误。 这意味着套接字“已经在使用”,尽管我在收到数据后正在销毁套接字。

如果我删除 for 循环并且只读取 1 个地址,它就可以正常工作...

如果我添加超时,它们不会触发......我也不知道为什么。

var socket = new net.Socket(); 
var test = [];
test[0] =  '10.5.0.5';
test[1] =  '10.5.0.11';

for(var i=0;i<test.length;i++) {

   socket.connect('2711', test[i], function() {
      socket.write('d\n');
      console.log("1");
      console.log(test[i]);

   socket.on('data', function(data) {
      data = data.toString();
      console.log(data);
      socket.destroy();
      console.log("2");
   });
 });
}

高度赞赏的帮助。 提前致谢。

【问题讨论】:

    标签: node.js sockets express websocket


    【解决方案1】:

    “For 循环”是同步的,但“.connect”和“.on('data'”是异步的,因此 for 循环在第一次连接发生之前完成。第二次连接尝试发生在第一次连接仍在进行中时,这就是你得到连接错误的原因。

    您应该尝试递归函数,逐步推进。例如,我创建了一个接收数组的函数,并迭代数组的第一个元素,连接,并在数据上关闭它,如果数组仍有更多项,则再次调用该函数。

    var socket = new net.Socket(); 
    var test = [];
    test[0] =  '10.5.0.5';
    test[1] =  '10.5.0.11';
    
    
    function testIP(test){
    
       socket.connect('2711', test.shift(), function() {
          socket.write('d\n');
          console.log("1");
    
       socket.on('data', function(data) {
          data = data.toString();
          console.log(data);
          socket.destroy();
          console.log("2");
          if( test.length > 0 ){
            testIP(test);
          }
       });
    }
    testIP(test);
    

    奖励:有libraries in Node.js 可以处理异步任务

    【讨论】:

    • 有效!非常感谢你。我什至从未听说过 .shift(),我应该看看。我也很难处理所有异步/同步的东西。像我这样的初学者很难。
    猜你喜欢
    • 2012-10-21
    • 2021-12-03
    • 2016-09-14
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多