我正在尝试建立一个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 })