node.js中的HTTP keep-alive

时间:2015-01-30 04:02:28

标签: node.js http keep-alive

我正在尝试设置HTTP客户端以在node.js中保持底层连接打开(保持活动状态),但似乎该行为与文档(http://nodejs.org/api/http.html#http_class_http_agent)不对应。 / p>

我正在创建一个新的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, res, body) {
        setTimeout(run, 1000);
    });
}

run();

3 个答案:

答案 0 :(得分:6)

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

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

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

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

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

请注意keepAlive: true属性,必需以保持套接字打开。

您也可以将代理传递到here模块,再次仅适用于0.12 +,否则默认为内部池实现。

答案 1 :(得分:0)

我想它应该适用于节点0.12+。您可能还希望为此目的使用其他代理。例如,keep-alive-agent可以执行您想要的操作:

var KeepAliveAgent = require('keep-alive-agent'),
    agent = new KeepAliveAgent();

答案 2 :(得分:0)

下面的meteor在meteor中使用npm模块进行keepaliveagent

var agent = new KeepAliveAgent({ maxSockets: 1 });

var options = {
  agent:agent,
  headers: {"Connection":"Keep-Alive"}
}

try {
  var client = Soap.createClient(url);

  var result = client.myfirstfunction(args,options);

//process result
  result = client.mysecondfunction(args,options);

}

两个方法调用都在一个套接字连接中返回数据。您在每个方法调用中传递选项