javascript - Soalan tentang kaedah close() kelas http.Server◔ ‸◔?
为情所困
为情所困 2017-05-16 13:42:34
0
1
775

Kod

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');
})

Penerangan

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, HTTPsambungan 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);

Soalan

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?

为情所困
为情所困

membalas semua(1)
PHPzhong

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

Ternyata server.close() hanya menghentikan pelayan daripada menerima sambungan baharu dan tidak menutup pelayan secara langsung. Hanya apabila semua sambungan diputuskan, pelayan akan dimatikan dan acara tutup dipancarkan. Persoalannya ialah bilakah ia dikira sebagai semua sambungan diputuskan? 原来 server.close() 只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 close 事件。 问题在于什么时候算所有连接都断开

当你执行 res.end('res ok'); 的时候,http 连接并没有关闭,因为你的请求的 Connectionkeep-alive

Apabila anda melaksanakan res.end('res ok');, sambungan http tidak ditutup kerana 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🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan