node.jsプログラミングを始めて、tcpソケットクライアントを書いています。
クライアントをサーバーに接続したい。サーバーが利用できない場合 (つまり、サーバーが合意されたポートに存在しない場合)、クライアントがタイムアウトし、タイムアウト後に再接続する必要があります。
このコードがありますが、2 番目の client.connect でハングします。どうしたの?
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 9000;
var client = new net.Socket();
client.connect(PORT, HOST, function(){
console.log('CONNECTED TO: ' + HOST + ':' + PORT);
client.write('I am Superman!');
});
client.on('error', function(e) {
while (e.code == 'ECONNREFUSED') {
console.log('Is the server running at ' + PORT + '?');`
socket.setTimeout(1000, function() {
console.log('Timeout for 5 seconds before trying port:' + PORT + ' again');
}
client.connect(PORT, HOST, function(){
console.log('CONNECTED TO: ' + HOST + ':' + PORT);
client.write('I am the inner superman');
});
});
});
更新されたコード:
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 9000;
var client = new net.Socket();
client.connect(PORT, HOST, function(){
console.log('CONNECTED TO: ' + HOST + ':' + PORT);
client.write('I am Superman');
});
client.on('error', function(e) {
while (e.code == 'ECONNREFUSED') {
console.log('Is the server running at ' + PORT + '?');
client.setTimeout(4000, function() {
client.connect(PORT, HOST, function() {
console.log('CONNECTED TO: ' + HOST + ':' + PORT);
client.write('I am inner Superman');
});
console.log('Timeout for 5 seconds before trying port:' + PORT + ' again');
});
}
});
client.on('data', function(data) {
console.log('DATA: ' + data);
client.destroy();
});
client.on('close', function() {
console.log('Connection closed');
});
更新されたコードでは、タイムアウトが有効に見えません。対応するサーバーがない状態でこのクライアントを起動すると、4 秒も待たずに結果が以下に表示されます。
Is the server running at 9000?
Is the server running at 9000?
Is the server running at 9000?
Is the server running at 9000?
…
更新(間違ったツリーを吠えていますか?)
戻って socket.on('error') イベントを確認したところ、エラーの直後に close イベントが呼び出されていることがわかりました。したがって、コードは 4 秒待たずに tcpclient を閉じます。より良いアイデアはありますか?