1

我使用 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

有任何想法吗?

4

1 回答 1

4

end当客户端关闭连接时触发该事件。在这种情况下,默认行为net.createServer也是关闭连接(但见下文),因此在调用回调时没有更多remoteAddress连接remotePort

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

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

另一个选项是 enable 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
  });
});
于 2013-05-15T10:56:51.523 回答