2012-04-30 28 views
1

为了学习有关使用node.js构建tcp服务的基础知识并确定可用信息,我构建了一个简单的echo服务器。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和I上使用tcp服务器,所以我开始制作一个简单的聊天室服务器。我在每次建立新连接时存储一个当前存在的连接列表,并且当来自一个连接的数据通过时,我会将其添加到所有其他连接中。我需要做的是删除断开连接,为了做到这一点,我需要知道他们的端口和地址,以便我可以从连接列表中删除它。 我会如何解决这个问题? –

+0

取决于您如何存储远程地址和端口。我会做的是在连接时将它们的组合添加到数组中,并在套接字关闭时将它们从数组中移除。该数组必须在可以在该函数(套接字){'闭包中访问的范围内定义。 – dwieeb

+0

这就是我所做的。当它关闭时,当它从数组中移除套接字时,变量套接字不会存储任何内容。 –