var http = require('http');
var server = http.createServer().listen(4000);
server.on('close', function () {
console.log('close event', Date.now());
});
server.on('request', function (req, res) {
console.log('request', Date.now());
server.close(function () {
console.log('server closed!', Date.now());
});
res.end('res ok');
})
Warum server.close()
,却不能触发 close
Event nutzen?
Schauen Sie sich die HTTP-API-Beschreibung an:
Hindern Sie, dass der Server neue Verbindungen empfängt.
Und TCP-API-Beschreibung:
Bewirkt, dass der Server keine neuen Verbindungen mehr akzeptiert und nur bestehende Verbindungen beibehält. Diese Funktion ist asynchron. Wenn alle Verbindungen getrennt werden, wird der Server geschlossen und das Ereignis „Schließen“ ausgegeben...
Original server.close()
只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 close
Veranstaltung.
Allerdings kann eine Änderung des Codes auf einen verzögerten Anruf den Server direkt herunterfahren (natürlich muss eine HTTP
Verbindung innerhalb von 5 Sekunden hergestellt werden).
var http = require('http');
var server = http.createServer().listen(4000);
server.on('close', function () {
console.log('close event', Date.now());
});
server.on('request', function (req, res) {
console.log('request', Date.now());
res.end('res ok');
})
function closeServer() {
server.close(function () {
console.log('server closed!', Date.now());
});
}
setTimeout(function () {
closeServer();
}, 5000);
Wenn Sie der Beschreibung in der API folgen, stoppt die close()
Methode lediglich den Server daran, neue Verbindungen zu akzeptieren. Warum kann der Server also direkt heruntergefahren werden, indem auf die letztere Methode umgestellt wird?
api 的描述是正确的。只是你测试的时候理解错了,两种关闭 http 服务最终都会关闭,只是运行逻辑不同。
运行过程
代码 1 会一直等待你建立 http 连接不关闭,直到你请求 1 次 http 连接,然后会在这次请求后的 2 分钟后才关闭 http 服务。
代码 2 会等待你 5 秒钟,如果 5 秒之内你没有建立连接,会直接关闭 http 服务。如果 5 秒之内你请求 1 次 http 连接,然后会在这次请求后的 2 分钟后才关闭 http 服务。
运行过程的原因
原来 server.close() 只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 close 事件。
问题在于什么时候算所有连接都断开
?当你执行 res.end('res ok'); 的时候,http 连接并没有关闭,因为你的请求的
Connection
是keep-alive
,这个时候只是 http 服务返回数据,浏览器渲染页面,http 连接仍然是开启状态,然后如果你 2 分钟内没有新的请求,这次 http 连接才关闭。2 分钟是 http 服务(不是 http 请求)默认的 timeout。soonfy