在nodejs.org socket.setTimeout上,它说
当触发空闲超时时,套接字将收到“超时”事件,但不会切断连接。
但是当我测试这样的代码时:
var http = require('http');
server = http.createServer(function (request, response) {
request.socket.setTimeout(500);
request.socket.on('timeout', function () {
response.writeHead(200, {'content-type': 'text/html'});
response.end('hello world');
console.log('timeout');
});
});
server.listen(8080);
套接字在超时后立即关闭,并且没有数据被回复到浏览器。这与文件完全不同。这是一个错误还是在http模块下有任何处理套接字的技巧?
答案 0 :(得分:6)
文档确实是正确的,但看起来http
模块添加了一个调用socket.destroy()
的“超时”监听器。所以你需要做的是通过调用request.socket.removeAllListeners('timeout')
来摆脱那个监听器。
所以你的代码应该是这样的:
var http = require('http');
server = http.createServer(function (request, response) {
request.socket.setTimeout(500);
request.socket.removeAllListeners('timeout');
request.socket.on('timeout', function () {
response.writeHead(200, {'content-type': 'text/html'});
response.end('hello world');
console.log('timeout');
});
});
server.listen(8080);