recherche

Maison  >  Questions et réponses  >  le corps du texte

javascript - Des questions sur la méthode close() de la classe http.Server◔ ‸◔?

Code

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

Description

Pourquoi utiliser server.close(),却不能触发 close événement ?
Regardez la description de l'API HTTP :

Arrêtez que le serveur reçoive de nouvelles connexions.

Et description de l'API TCP :

Fait en sorte que le serveur cesse d'accepter de nouvelles connexions et ne conserve que les connexions existantes. Cette fonction est asynchrone, lorsque toutes les connexions sont déconnectées, le serveur est fermé et l'événement 'close' est émis...

Événement server.close() 只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 closeoriginal.

Cependant, changer le code en appel différé peut arrêter directement le serveur (bien sûr, une HTTPconnexion doit être établie dans les 5 secondes).

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

Question

Si vous suivez la description dans l'API, la close()méthode empêche simplement le serveur d'accepter de nouvelles connexions. Alors, pourquoi le serveur peut-il être arrêté directement en passant à cette dernière méthode ?

为情所困为情所困2783 Il y a quelques jours778

répondre à tous(1)je répondrai

  • PHPz

    PHPz2017-05-16 13:44:34

    La description de l'API est correcte. C'est juste que vous avez mal compris lors des tests. Les deux types de services http d'arrêt finiront par être arrêtés, mais la logique d'exécution est différente.

    Processus en cours

    Le Code 1 attendra que vous établissiez une connexion http sans la fermer jusqu'à ce que vous demandiez une connexion http, puis fermera le service http 2 minutes après cette demande.

    Le code 2 vous attendra pendant 5 secondes. Si vous n'établissez pas de connexion dans les 5 secondes, le service http sera directement fermé. Si vous demandez une connexion http dans les 5 secondes, le service http sera fermé 2 minutes après la demande.

    Raison de l'exécution du processus

    Il s'avère que server.close() empêche uniquement le serveur de recevoir de nouvelles connexions et n'arrête pas directement le serveur. Ce n'est que lorsque toutes les connexions seront déconnectées que le serveur sera arrêté et que l'événement de fermeture sera émis. La question est de savoir quand est-ce que cela compte comme toutes les connexions sont déconnectées ? 原来 server.close() 只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 close 事件。 问题在于什么时候算所有连接都断开

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

    Lorsque vous exécutez res.end('res ok');, la connexion http n'est pas fermée car la Connexion de votre requête est keep-alive. juste que le service http renvoie des données, le navigateur restitue la page et la connexion http est toujours ouverte. Ensuite, si vous ne faites pas de nouvelle demande dans les 2 minutes, la connexion http est fermée cette fois. 2 minutes est le délai d'expiration par défaut pour les services http (et non pour les requêtes http).

    bientôt🎜

    répondre
    0
  • Annulerrépondre