1

telnetを使用してこのnodejsコードを介して接続しました。telnet を終了すると、「終了」イベントが発生しますが、リモート アドレスとポートは表示されません。

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);
  });
});

もう 1 つのオプションは、有効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 に答える