gpt4 book ai didi

javascript - 为什么不监听数据事件只能发送5个请求?

转载 作者:可可西里 更新时间:2023-11-01 16:42:33 25 4
gpt4 key购买 nike

我发现了一些问题,似乎与这个问题有一些关系(例如:Why is node.js only processing six requests at a time?),但我仍然无法理解细节。

以下是我的情况。

首先是服务器代码:

var express = require ('express'),
methodOverride = require('method-override');

var app = express();

app.use(methodOverride());
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500);
res.send({ error: err });
});

app.use('/', function(req, res, next) {
res.header('Cache-control', 'no-cache');
res.header('Access-Control-Allow-Origin', '*');
next();
});

app.get('/OK/', function (req, res) {
console.log(getTimestamp() + ' OK ');
res.status(200).send("200");
});

app.listen(22222);

function getTimestamp(){
var timestamp = new Date();
return timestamp.toString() + " " + timestamp.getMilliseconds();
}

console.log(getTimestamp() + ' Sever started!');

然后是客户端的代码:

var http = require('http');

var opt = {
method: "GET",
host: "localhost",
port: 22222,
path: "/OK/",
headers: {
'Cache-control': 'no-cache'
}
};

count = 10;
function request(){
var req = http.request(opt, function (serverFeedback) {
var body = "";
serverFeedback
.on('data',function(){})
.on('end', function () {
console.log(getTimestamp(), "response END", serverFeedback.statusCode, body);
});
});
req.end();

console.log(getTimestamp(), "resuest START");
count--;
if(count > 0){
setTimeout(request, 500);
}
}

request();

function getTimestamp(){
var timestamp = new Date();
return timestamp.toString() + " " + timestamp.getMilliseconds();
}

都在node中运行,当然先运行server,5s左右client会发送10个请求,一切正常。像这样: enter image description here

但是,如果我删除有关在客户端中监听“数据”事件的代码,如下所示:

var req = http.request(opt, function (serverFeedback) {
var body = "";
serverFeedback
//.on('data',function(){}) /* remove the listener*/
.on('end', function () {
console.log(getTimestamp(), "response END", serverFeedback.statusCode, body);
});
});

再次运行,客户端看似在5s内发送了10个请求,但实际上服务端只收到了5个请求: enter image description here

如您所见,“结束”事件似乎并未触发。

最后,我通过服务器代码在响应中添加了一个 header :

app.use('/', function(req, res, next) {
res.header('Cache-control', 'no-cache');
res.header('Access-Control-Allow-Origin', '*');
res.header('connection', 'close'); /* add a header about connection */
next();
});

重启服务器并再次运行客户端: enter image description here

现在服务器可以立即收到所有10个请求,但“结束”事件似乎仍然没有触发。

因此,“数据”事件的监听器似乎对 http 连接产生了一些影响。

谁能给大家详细解释一下?

最佳答案

有两件事正在发生。

首先,当您不“监听数据事件”时,响应流永远不会完成,因此您发出的 http 请求永远不会完成。这本质上是一个泄漏。 始终消耗您的流!!!否则,您的流将无限期地处于“暂停”状态。

第二个是 node.js 默认使用默认代理池连接 http://nodejs.org/api/http.html#http_class_http_agent .现在,它汇集了 5 个连接,这就是为什么您会看到 5 个连接的限制。

关于javascript - 为什么不监听数据事件只能发送5个请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27897741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com