Node.js 网络套接字:无法连接到多个 IP

Posted

技术标签:

【中文标题】Node.js 网络套接字:无法连接到多个 IP【英文标题】:Node.js Net Sockets: Can't connect to multiple IP's 【发布时间】: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");
   );
 );

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

【问题讨论】:

【参考方案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(),我应该看看。我也很难处理所有异步/同步的东西。像我这样的初学者很难。

以上是关于Node.js 网络套接字:无法连接到多个 IP的主要内容,如果未能解决你的问题,请参考以下文章

Web 套接字和 Flash 套接字客户端连接到一个 Node.js

如何从任何 ip 连接到 node.js 服务器

连接到 IP 时出现错误(套接字失败:EPERM)

我如何连接到 Node.js 中的星号

如何从网络服务器检查套接字?

尝试将 node.js unix 套接字客户端连接到 C 程序时出现 EPROTOTYPE 错误