0

为什么我不能通过在浏览器中请求 localhost:13777/close 来关闭服务器(它继续接受新请求),但它会在超时 15000 时正常关闭?节点版本为 0.10.18。我陷入了这个问题,尝试使用文档中关于域处理异常的代码示例(每次我第二次尝试请求错误页面时,它都会给我“未运行”错误),最后来到了这个代码。

var server

server = require("http").createServer(function(req,res){

  if(req.url == "/close")
  {
    console.log("Closing server (no timeout)")

    setTimeout(function(){
      console.log("I'm the timeout")
    }, 5000);    

    server.close(function(){
      console.log("Server closed (no timeout)")
    })    

    res.end('closed');
  }
  else
  {
    res.end('ok');
  }

});

server.listen(13777,function(){console.log("Server listening")});

setTimeout(function(){

  console.log("Closing server (timeout 15000)")
  server.close(function(){console.log("Server closed (timeout 15000)")})

}, 15000);
4

2 回答 2

3

服务器仍在等待来自客户端的请求。客户端正在使用 HTTP keep-alive。

我想您会发现,虽然现有客户端可以发出新请求(因为连接已经建立),但其他客户端将不能。

于 2013-09-22T06:30:57.653 回答
2

Nodejs 没有在http.Server. 通过调用server.close()您指示服务器不再接受任何“新”连接。当发出 HTTP 时Connection:keep-alive,服务器将保持套接字打开,直到客户端终止或达到超时。其他客户端将无法发出请求

可以使用server.setTimeout() https://nodejs.org/api/http.html#http_server_settimeout_msecs_callback更改超时

请记住,如果客户端在close该连接可以继续使用之前创建了连接。

似乎很多人不喜欢这个当前的功能,但这个问题已经开放了很长一段时间:

https://github.com/nodejs/node/issues/2642

于 2016-06-16T03:11:40.910 回答