Node.js 在节点中,在循环中发布HTTP请求(比如0-10000),抛出错误为:套接字挂起
代码座右铭:为了检查redis发布/订阅性能,我尝试在node.js的循环中发出http请求 问题是:假设我的循环范围为0到10000,当我运行节点时,它将在循环中发送post请求。它可以正常工作到预期的120秒。当套接字挂起时,该节点抛出错误。在检查解决方案时,我发现节点的默认套接字超时为2分钟 问题是: 1.是否可以通过更改默认超时来解决此问题? 2.如果是,我们如何更改默认值。? 3.除了更改套接字超时值之外,还有其他方法可以解决此问题吗 代码为:Node.js 在节点中,在循环中发布HTTP请求(比如0-10000),抛出错误为:套接字挂起,node.js,http,Node.js,Http,代码座右铭:为了检查redis发布/订阅性能,我尝试在node.js的循环中发出http请求 问题是:假设我的循环范围为0到10000,当我运行节点时,它将在循环中发送post请求。它可以正常工作到预期的120秒。当套接字挂起时,该节点抛出错误。在检查解决方案时,我发现节点的默认套接字超时为2分钟 问题是: 1.是否可以通过更改默认超时来解决此问题? 2.如果是,我们如何更改默认值。? 3.除了更改套接字超时值之外,还有其他方法可以解决此问题吗 代码为: var clientNo = 10000
var clientNo = 100000,a=0;
var express = require('express'),
app = express(),
http = require('http'),
server = http.createServer(app);
http.globalAgent.maxSockets = Infinity;
app.enable('trust proxy');
app.disable( 'x-powered-by' );
app.use(express.bodyParser());
app.use(app.router);
app.set('port', 6002);
server.listen(app.get('port'));
var postint= setInterval(function(){
makeSubscription(a,function(query){
var options = {
path:query,
port: '6001',
method: 'POST'
};
var req = http.request(options, function(response){
response.on('end', function () {
console.log("Ends");
});
});
req.on('error', function (e) {
console.log(e);
});
req.end();
});
a++;
if(a == clientNo)
{
clearInterval(postint);
}
},1);
注意:我正在用1秒设置超时向不同路径上的同一端口发送另一个post请求。严格来说,问题可能不在于超时,而在于
响应
是错误的
请注意,end
事件不会触发,除非数据被完全消耗。这可以通过切换到流动模式,或者反复调用read()
,直到结束
这是因为节点0.10及更高版本中存在流
在您指示准备接收数据之前,可读流不会开始发送数据
有3个选项可以启动它:
您是否正在从服务器发送有效响应?“套接字挂起”错误看起来像是等待响应的超时。请检查您的服务器代码或尝试从rest客户端发布,并确保您得到响应。代码编写简单,可以完成相同的工作
var a=0,clientNo = 10;
var http=require('http');
var sub = setInterval(function(){
var temp = '/?channel=channel'+a;
var options = {
host:'127.0.0.1',
port:'6001',
path:temp,
method:'POST'
};
a++;
var req = http.request(options,function(res){
res.on('data', function(chunk) {
console.log('data');
});
res.on('error', function(err) {
console.log(err);
});
res.on('end', function() {
console.log('end');
});
});
req.on('error',function(err){
console.log(Date());
});
req.end();
if(a== clientNo)
{
clearInterval(sub);
}
},1);
也可以用同样的方式发送更多请求。谢谢@Skanda。从服务器发送回客户端的响应丢失。这个错误被修正了。
response.on('readable', function () {
var chunk;
while (chunk = response.read()) {
console.log(chunk.toString());
}
});
response.on('end', function () {
console.log('End');
});
response.resume();
response.on('end', function () {
console.log('End');
});
var a=0,clientNo = 10;
var http=require('http');
var sub = setInterval(function(){
var temp = '/?channel=channel'+a;
var options = {
host:'127.0.0.1',
port:'6001',
path:temp,
method:'POST'
};
a++;
var req = http.request(options,function(res){
res.on('data', function(chunk) {
console.log('data');
});
res.on('error', function(err) {
console.log(err);
});
res.on('end', function() {
console.log('end');
});
});
req.on('error',function(err){
console.log(Date());
});
req.end();
if(a== clientNo)
{
clearInterval(sub);
}
},1);