2017-10-27 112 views
0

net.Socket()でsocket.write()を使用してデータを送信するときにサーバーがオフラインであるかどうかを検出できるかどうかを知りたいと思います。私はエラーイベントまたはタイムアウトイベントは、切断されたサーバーのソケットに書き込もうとした後にトリガーされるだろうと仮定しますが、これは動作することができません。それは単にsocket.writeを起動し、何も起こりません。ここにいくつかのサンプルコードがあります。node.js net.Socket socket.write()エラー処理

try { 
    socket = new net.Socket(); 
    socket.connect(data.port, data.address); 
} catch (error) { 
    console.log(error); 
} 

socket.on('connect', function() { 
    interval = setInterval(function() { 
     socket.write('sending message'); 
    }, 1000); 
}); 

socket.on('error', function(error) { 
    clearInterval(interval); 
    socket.destroy(); 
    socket.unref(); 
    console.log(error); 
}); 

[EDIT 1]

汚れた溶液を、以下のコードであろうが、これは右感じていません。ソケットに書き込むときにタイマーを設定します。データが受信された場合(私の状況ではソケットに書き込んだ後の場合)、タイマーはキャンセルされます。タイマがキャンセルされないと、ソケットは破棄されます。デフォルトnet.Socketことで

try { 
    socket = new net.Socket(); 
    socket.connect(data.port, data.address); 
} catch (error) { 
    console.log(error); 
} 

socket.on('connect',() => { 
    interval = setInterval(function() { 
     socket.write('sending message',() => { 
      timeout = setTimeout(() => { 
       socket.destroy(); 
       socket.unref(); 
      }, 4000); 
     }); 
    }, 5000); 
}); 

socket.on('error', (error) => { 
    clearInterval(interval); 
    socket.destroy(); 
    socket.unref(); 
    console.log(error); 
}); 

socket.on('data', (message, address) => { 
    clearTimeout(timeout); 
}) 
+0

閉じるイベントが発生しないためです。 – Solide

+0

私は自分の問題を汚れた解決策の解決策で編集しました。それは右の気分ではありません。 – Solide

答えて

0

あなただけがそうのようなソケットのタイムアウトを設定することができますsocket timeOut タイムアウトイベントを聞くことによって、これを検出することができ、

socket.setTimeout(3000); 

はタイムアウトを持っていません。

+0

Socket.write()は、サーバーがオフラインになってタイムアウトイベントが発生しない場合でも、タイムアウトをキャンセルしたようです。 – Solide