nodejs 怎样创建一个http长连接的客户端

JavaScript09

nodejs 怎样创建一个http长连接的客户端,第1张

默认情况下,NodeJS HTTP 服务器对每个客户端的Web Request的连接时长是2分钟,也就是说,一旦2分钟内,你服务器端没有发送response,那么客户端的连接就会被关闭(重置?),在现实的应用中,我后台处理数据的时间可能很长,也许3分钟,也许5分钟,客户也愿意等待,那么我完全可以把连接时长设置的多一些。为了解决这个问题,我找了很久,网上大多数说的是怎么缩短timeout的时间,而且很多都是自己调用全局的setTimeout()函数来控制的,说nodeJs没有提供相应的API。直到昨天才发现,原来nodeJs的Http库,有一个setTimeout()的函数,可以解决这个问题,(我本机的,0.6版是没有这个函数的),这篇文章有提及: http://contourline.wordpress.com/2011/03/30/preventing-server-timeout-in-node-js/

说明:

调用nodeJs API, http.createServer()返回的Server对象,有一个setTimeout()方法,可以传入你想要的连接时长,默认是1200000(即2分钟),改成0表示不会timeout。而response对象,也有一个setTimeout()方法,我不知道两者有什么区别,但是我的理解是server.setTimeout()是全局的,response.setTimeout()只针对本次request。

代码:

对于expressJs,相关代码是:

var server = http.createServer(app)

server.setTimeout(0)

server.listen(app.get('port'), function () {

console.log('Express server listening on port ' + app.get('port'))

})

对于restify,相关代码是:

server.server.setTimeout(0)

server.listen(8080, function () {

console.log('%s listening at %s', server.name, server.url)

})

var os = require('os')

var http = require('http')

var fs = require('fs')

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

    if (/^\/a.html/.test(req.url)) {

        fs.createReadStream('a.html').pipe(res)

    } else {

        console.log(req.connection.remoteAddress + ':' + req.connection.remotePort)

        res.writeHead(200, {'Content-Type': 'text/plain'})

        res.end('Hello World\n')

    }

}).listen(8124)

server.setTimeout(0)   //设置不超时,所以服务端不会主动关闭连接

console.log('start ' + os.hostname() + ':8124')