Nodejs需要查看哪个客户端已退出

时间:2013-05-15 10:49:03

标签: node.js

我使用telnet连接了这个nodejs代码。从telnet退出时,'end'事件将触发但不显示远程地址和端口。

var net = require('net');
var server = net.createServer(function(s) {

   console.log('CONNECT:' + s.remoteAddress + ':' + s.remotePort);

   s.on('data', function(data) {
      console.log('DATA: ' + s.remoteAddress + ':' + s.remotePort);
      s.write('You said "' + data + '"');
   });

   s.on('end', function() {
      console.log('END: ' + s.remoteAddress + ':' + s.remotePort);
   });

   s.write('hello\r\n');
});

server.listen(8000, function() {
   console.log('Server started on port 8000');
});

在服务器控制台上,当我退出telnet时,我得到以下内容

END: undefined:undefined disconnected

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

当客户端关闭连接时会触发end事件。在这种情况下,net.createServer的默认行为也是关闭连接(但请参见下文),因此在调用回调时不再有remoteAddressremotePort。< / p>

最简单的解决方案是在创建连接时将这些值存储在变量中:

var server = net.createServer(function(s) {
  var address = s.remoteAddress;
  var port    = s.remotePort;
  ...
  s.on('end', function() {
    console.log('END: ' + address + ':' + port);
  });
});

另一种选择是启用allowHalfOpen,这将阻止服务器在客户端关闭时关闭连接:

var server = net.createServer({ allowHalfOpen : true }, function(s) {
  ...
  s.on('end', function() {
    console.log('END: ' + s.remoteAddress + ':' + s.remotePort);
    s.end(); // !!! close the server side explicitly
  });
});