Rumah > Soal Jawab > teks badan
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?
PHPz2017-05-16 13:44:34
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.
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.
semua sambungan diputuskan
? 原来 server.close() 只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 close 事件。
问题在于什么时候算所有连接都断开
?
当你执行 res.end('res ok'); 的时候,http 连接并没有关闭,因为你的请求的 Connection
是 keep-alive
Connection
permintaan anda adalah keep-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). soonfy🎜