我使用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
有什么想法吗?
答案 0 :(得分:4)
当客户端关闭连接时会触发end
事件。在这种情况下,net.createServer
的默认行为也是关闭连接(但请参见下文),因此在调用回调时不再有remoteAddress
和remotePort
。< / 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
});
});