que*_*dam 9 http keep-alive node.js
我正在尝试建立一个HTTP客户端,以便在node.js中保持底层连接打开(保持活动状态),但似乎该行为与文档不对应(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, res, body) {
setTimeout(run, 1000);
});
}
run();
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,连接池是在0.12中实现的。
因此,如果您想拥有0.12之前的连接池,则可以简单地使用request模块:
var request = require('request')
request.get('www.twilio.com', {forever: true}, function (err, res, body) {});
Run Code Online (Sandbox Code Playgroud)
如果您正在使用节点0.12+,并且想直接使用HTTP核心模块,那么可以使用它来初始化代理:
var agent = new http.Agent({
keepAlive: true,
maxSockets: 1,
keepAliveMsecs: 3000
})
Run Code Online (Sandbox Code Playgroud)
注意该keepAlive: true属性,该属性是保持套接字打开所需的。
您也可以将代理传递给请求模块,同样只能在0.12+上运行,否则默认为内部池实现。
我想它应该可以在节点 0.12+ 上运行。您可能还想使用不同的代理来实现此目的。例如keep-alive-agent可以做你想做的事:
var KeepAliveAgent = require('keep-alive-agent'),
agent = new KeepAliveAgent();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33484 次 |
| 最近记录: |