node.js中的HTTP keep-alive

我正在尝试建立一个HTTP客户端,以便在node.js中保持底层连接处于打开状态(keep-alive),但似乎该行为与docs( http://nodejs.org/api/http.html#http_class_http_agent)不对应.

我正在创建一个新的HTTP代理,将maxSockets属性设置为1并每秒请求一个url(例如http://www.twilio.com/).

似乎每次请求都关闭套接字并创建一个套接字.
我在Ubuntu 14.04下使用node.js 0.10.25和0.10.36对此进行了测试.

有没有人能够继续工作?

这是代码

var http = require("http");

var agent = new http.Agent();
agent.maxSockets = 1;

var sockets = [];

function request(hostname,path,callback) {
    var options = {
        hostname: hostname,path: path,agent: agent,headers: {"Connection": "keep-alive"}
    };
    var req = http.get(options,function(res) {
        res.setEncoding('utf8');
        var body = "";
        res.on('data',function (chunk) {
            body += chunk;
        });
        res.on('end',function () {
            callback(null,res,body);
        });
    });
    req.on('error',function(e) {
        return callback(error);
    });
    req.on("socket",function (socket) {
        if (sockets.indexOf(socket) === -1) {
            console.log("new socket created");
            sockets.push(socket);
            socket.on("close",function() {
                console.log("socket has been closed");
            });
        }
    });
}

function run() {
    request('www.twilio.com','/',function (error,body) {
        setTimeout(run,1000);
    });
}

run();

解决方法

如果我没弄错,连接池是在0.12中实现的.

因此,如果您想要一个0.12之前的连接池,您只需使用request模块:

var request = require('request')
request.get('www.twilio.com',{forever: true},function (err,body) {});

如果您使用的是节点0.12并且想要直接使用HTTP核心模块,则可以使用它来初始化您的代理:

var agent = new http.Agent({
  keepAlive: true,maxSockets: 1,keepAliveMsecs: 3000
})

请注意keepAlive:true属性,这是保持套接字打开所必需的.

您也可以将代理传递到request模块,再次只能在0.12上运行,否则它认为内部池实现.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...