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');
})
Kenapa guna server.close()
,却不能触发 close
acara?
Lihat penerangan API HTTP:
Hentikan pelayan menerima sambungan baharu.
Dan penerangan API TCP:
Menyebabkan pelayan berhenti menerima sambungan baharu dan hanya mengekalkan sambungan sedia ada. Fungsi ini tidak segerak, apabila semua sambungan terputus, pelayan ditutup dan acara 'tutup' dipancarkan...
Asal server.close()
只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 close
acara.
Walau bagaimanapun, menukar kod kepada panggilan tertunda boleh terus mematikan pelayan (sudah tentu, HTTP
sambungan mesti diwujudkan dalam masa 5 saat).
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);
Jika anda mengikuti penerangan dalam API, close()
kaedah hanya menghentikan pelayan daripada menerima sambungan baharu. Jadi, mengapakah pelayan boleh ditutup terus dengan menukar kepada kaedah yang terakhir?
Penerangan API adalah betul. Cuma anda salah faham semasa menguji kedua-dua jenis perkhidmatan http penutupan akhirnya akan ditutup, tetapi logik yang dijalankan adalah berbeza.
Proses berjalan
Kod 1 akan menunggu untuk anda mewujudkan sambungan http tanpa menutupnya sehingga anda meminta sambungan http, dan kemudian menutup perkhidmatan http 2 minit selepas permintaan ini.
Kod 2 akan menunggu anda selama 5 saat Jika anda tidak membuat sambungan dalam masa 5 saat, perkhidmatan http akan ditutup terus. Jika anda meminta sambungan http dalam masa 5 saat, perkhidmatan http akan ditutup 2 minit selepas permintaan itu.
Sebab proses berjalan
semua sambungan diputuskan
?原来 server.close() 只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 close 事件。
问题在于什么时候算所有连接都断开
?当你执行 res.end('res ok'); 的时候,http 连接并没有关闭,因为你的请求的
Apabila anda melaksanakan res.end('res ok');, sambungan http tidak ditutup keranaConnection
是keep-alive
Connection
permintaan anda adalahkeep-alive
Pada masa ini hanya bahawa perkhidmatan http mengembalikan data, penyemak imbas memaparkan halaman, dan sambungan http masih terbuka Kemudian jika anda tidak membuat permintaan baharu dalam masa 2 minit, sambungan http ditutup kali ini. 2 minit ialah tamat masa lalai untuk perkhidmatan http (bukan permintaan http).