尝试重新连接Node.js中的TCP连接后,为什么会出现ECONNREFUSED错误?

Mik*_*ger 1 sockets node.js

我正在尝试使用以下命令在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
});
Run Code Online (Sandbox Code Playgroud)

如果其他程序没有运行(因此没有监听),第一次正确处理连接错误,但如果我在超时后再次尝试连接(失败),我会收到以下错误:

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

Error: connect ECONNREFUSED
Run Code Online (Sandbox Code Playgroud)

现在有人为什么第一次正确处理不成功的连接而不是第二次?我想在等待其他程序启动时继续尝试连接.

Jon*_*ski 5

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

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

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

要继续重试,请将"setup"包装在可根据需要调用的函数中:

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();
Run Code Online (Sandbox Code Playgroud)