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

失敗した接続が最初は正しく処理され、2回目は正しく処理されないのはなぜですか?他のプログラムが起動するのを待っている間、接続を試し続けたいのですが。

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、urコードを使用しているときに、サーバーを再起動すると複数の接続が開かれることに気付きました。'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 に答える