2

在 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 模块下有任何处理套接字的技巧?

4

1 回答 1

9

该文档确实是正确的,但是看起来该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);
于 2013-01-02T14:11:31.007 回答