3

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 を閉じます。より良いアイデアはありますか?

4

2 に答える 2

7

あなたのタイムアウトは逆です。

次のようになります。

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) {
    if(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 the 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');
});

タイムアウト後に実行する関数はコールバックです。それは実行を待つものです。

また、 を に変更whileしますif。その条件は、1 つのエラー イベントの間は変更されません。また、括弧と括弧が一致していません。

于 2013-11-14T17:18:41.903 に答える