2012-04-30 6 views
1

node.jsでtcpサービスを構築し、利用可能な情報を把握するための基礎を学ぶために、単純なエコーサーバーを構築しています。Nodejs TCPソケットの終了時にremoteAddress情報が含まれていない

以下に示すように、サーバーを作成しているときに、リモートアドレスなどのincomingSocketに関する情報にアクセスできます。なぜ私はソケットのクローズに関する情報にアクセスできないのですか?以下は私のコードです。私のコメントは私が受け取った出力を示しています。

var net = require ('net'); 
var server = net.createServer (
    function (incomingSocket) 
    { 
     //'connection' listener 
     console.log ('Connection from ' + incomingSocket.remoteAddress + ':' + incomingSocket.remotePort + " established."); 

     incomingSocket.on (
      'data' , 
      function (data) 
      { 
       // The incomingSocket.remoteAddress is defined here 
       console.log (incomingSocket.remoteAddress + ':' + incomingSocket.remotePort + ' -> ' + data.toString()); 
      } 
     ); 

     incomingSocket.on (
      'close' , 
      function() 
      { 
       // The incomingSocket.remoteAddress is undefined here 
       console.log ('connection from ' + incomingSocket.remoteAddress + ' closed.'); 
      } 
     ); 
     incomingSocket.pipe (incomingSocket); 
    } 
); 
// listening to a port happens here 

私は任意の応答を感謝します!ありがとうございました!

答えて

4

いいえ、ソケットクローズイベントのイベントハンドラに入ると、ソケットオブジェクトは存在しなくなります。ソケットが閉じているときにクライアントのリモートアドレスを表示する必要がある場合は、クライアントが最初に接続するときにリモートアドレスを保存するだけです。

var clients = new Array(); 

net.createServer(function(socket) { 
    var remoteAddress = socket.remoteAddress; 
    var remotePort = socket.remotePort; 

    // Add to array of clients 
    clients.push(remoteAddress + ':' + remotePort); 

    console.log('Connection from ' + remoteAddress + ':' + remotePort + " established."); 

    socket.on('data', function(data) { 
     console.log(remoteAddress + ':' + remotePort + ' -> ' + data.toString()); 
    }); 

    socket.on('close', function() { 
     // Remove from array of clients 
     clients.splice(clients.indexOf(remoteAddress + ':' + remotePort), 1); 

     console.log('Connection from ' + remoteAddress + ':' + remotePort + ' closed.'); 
    }); 

    ... 
+0

回答ありがとうございます。私はnode.js上でtcpサーバを使う方法を学びたかったので、簡単なchatroomサーバを作ることから始めました。私は新しい接続が行われるたびに現在存在する接続のリストに追加を保存し、ある接続からのデータが届くと、それを他のすべての接続を通して送信します。私がする必要があるのは、切断された接続を削除することです。これを行うには、接続のリストから削除できるように、ポートとアドレスを知る必要があります。 この問題を解決する方法を教えてください。 –

+0

リモートアドレスとポートの保存方法によって異なります。私が行うことは、接続時にそれらの組み合わせを配列に追加し、ソケットが閉じられたときにそれらを配列から削除することです。配列は、その 'function(socket){'クロージャーでアクセス可能なスコープで定義されなければなりません。 – dwieeb

+0

それは私がやったことです。ソケットを閉じるときにソケットを配列から取り除く時が来たら、変数socketは何も格納しません。 –

関連する問題