这是我正在处理的简单网络服务器
var server = require("http").createServer(function(req,resp) {
resp.writeHead(200,{"Content-Type":"text/plain"})
resp.write("hi")
resp.end()
server.close()
})
server.listen(80, 'localhost')
// The shortest webserver you ever did see! Thanks to Node.JS :)
除了保持活着外,效果很好。当第一个请求进入时,server.close
被调用。但这个过程并没有结束。实际上TCP连接仍处于打开状态,允许另一个请求通过,这是我试图避免的。
如何关闭现有的保持连接?
答案 0 :(得分:24)
您可以控制连接的空闲超时,以便设置保持连接保持打开的时间。例如:
server=require('http').createServer(function(req,res) {
//Respond
if(req.url.match(/^\/end.*/)) {
server.close();
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('Closedown');
} else {
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('Hello World!');
}
}).listen(1088);
//Set the idle timeout on any new connection
server.addListener("connection",function(stream) {
stream.setTimeout(4000);
});
我们可以用netcat测试:
ben@quad-14:~/node$ echo -e "GET /test HTTP/1.1\nConnection: keep-alive\n\n" | netcat -C -q -1 localhost 1088
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: keep-alive
Transfer-Encoding: chunked
c
Hello World!
0
after 4 seconds, the connection closes
现在我们可以证明关闭服务器的工作原理是:在删除所有空闲连接后,服务器退出:
ben@quad-14:~/node$ echo -e "GET /end HTTP/1.1\nConnection: keep-alive\n\n" | netcat -C -q -1 localhost 1088
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: keep-alive
Transfer-Encoding: chunked
9
Closedown
0
after 4 seconds, the connection closes and the server exits
答案 1 :(得分:18)
您可以在响应回调中调用request.connection.destroy()
。这将关闭请求连接。
它也将结束你的过程,因为没有什么可做的,最终结果就像在那里调用process.exit()
一样。
答案 2 :(得分:4)
如果您正在关闭服务器作为正常关闭流程的一部分,您只需要:
var server = require('http').createServer(myFancyServerLogic);
server.on('connection', function (socket) {socket.unref();});
server.listen(80);
function myFancyServerLogic(req, res) {
req.connection.ref();
res.end('Hello World!', function () {
req.connection.unref();
});
}
基本上,服务器使用的套接字只会使进程在实际提供请求时保持活动状态。虽然他们只是懒散地坐在那里(因为保持活跃的连接),但是对server.close()
的调用将关闭该过程,只要没有其他任何东西保持该过程活着。如果您需要在服务器关闭后执行其他操作,作为正常关闭的一部分,您可以挂钩process.on('beforeExit', callback)
以完成正常的关闭过程。