suchen

Heim  >  Fragen und Antworten  >  Hauptteil

javascript – Fragen zur close()-Methode der http.Server-Klasse◔ ‸◔?

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

Beschreibung

Warum server.close(),却不能触发 closeEvent 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 HTTPVerbindung 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);

Frage

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?

为情所困为情所困2749 Tage vor742

Antworte allen(1)Ich werde antworten

  • PHPz

    PHPz2017-05-16 13:44:34

    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 连接并没有关闭,因为你的请求的 Connectionkeep-alive,这个时候只是 http 服务返回数据,浏览器渲染页面,http 连接仍然是开启状态,然后如果你 2 分钟内没有新的请求,这次 http 连接才关闭。2 分钟是 http 服务(不是 http 请求)默认的 timeout。

    soonfy

    Antwort
    0
  • StornierenAntwort