1

我正在尝试使用以下命令在 Node.js 中打开与另一个程序的 TCP 连接:

connection = net.connect(18003, function() {
});

connection.on('close', function() {
  console.log('Connection closed');
});
connection.on('error', function() {
  console.log('Connection error');

  setTimeout(function () {
    connection = net.connect(18003, ipAddress,
      function() {
    });
  }, 10000); //Try to reconnect
});

如果其他程序未运行(因此未侦听),则第一次正确处理连接错误,但如果我在超时后再次尝试连接(不成功),则会收到以下错误:

events.js:68
  throw arguments[1]; // Unhandled 'error' event

Error: connect ECONNREFUSED

有谁现在为什么第一次正确处理了不成功的连接但第二次没有正确处理?我想在等待其他程序启动的同时继续尝试连接。

4

2 回答 2

5

您必须在每次重试时绑定到'error'事件,因为每次调用都net.connect()返回一个net.Socket带有自己的事件绑定的新事件:

// ...
  setTimeout(function () {
    connection = net.connect(18003, ipAddress,
      function() {
    });

    connection.on('error', function () {
      console.log('Connection retry error');
    });
  }, 10000); //Try to reconnect
// ...

为了不断重试,将“设置”包装在一个可以根据需要调用的函数中:

function setupConnection() {
  connection = net.connect(18003, ipAddress, function () {
  });

  connection.on('close', function() {
    console.log('Connection closed');
  });

  connection.on('error', function() {
    console.log('Connection error');

    setTimeout(setupConnection, 10000); //Try to reconnect
  });
}

setupConnection();
于 2013-01-28T18:12:33.043 回答
0

@Jonathan Lonowski,当我使用你的代码时,我注意到在服务器重启时它会打开多个连接。'error' 事件发生在套接字关闭之前。将递归调用移动到套接字关闭事件可以正常工作。

function setupConnection() {
  connection = net.connect(18003, ipAddress, function () {
  });
  connection.on('close', function() {
    console.log('Connection closed');
    setTimeout(setupConnection, 10000); //Try to reconnect EDITED
  });

  connection.on('error', function() {
    console.log('Connection error');
  });
}
setupConnection();
于 2013-12-16T15:25:56.550 回答