2013-05-15 55 views
1

我使用telnet通過此nodejs代碼連接。從telnet退出時,「結束」事件觸發但不顯示遠程地址和端口。Nodejs需要查看哪個客戶端已經退出

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

end事件在客戶端關閉連接時觸發。在這種情況下,net.createServer的默認行爲是關閉連接(但請參閱下文),因此在您調用回調時不再有remoteAddressremotePort

,最簡單的解決方法就是這些值存儲在一個變量中建立了連接時:

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

謝謝robertklep! – extensa5620