这些页面16和18之间有两个例子。
示例1.3是服务器应用程序
例1.4是一个客户端应用程序,它向服务器发出GET请求。
当我运行这两个例子(同时)时,我注意到一些非常奇怪的行为
在客户端。执行所有请求(即客户端中的for循环完成)
但只有5个回调被调用。客户不退出,也是
没有错误。并且不再召唤回调。
任何想法可能会发生什么或我如何进一步解决这个问题?
注意:我在Windows 7上运行Node.js v0.10.20。
服务器
var http = require('http');
var fs = require('fs');
// write out numbers
function writeNumbers(res) {
var counter = 0;
// increment, write to client
for (var i = 0; i<100; i++) {
counter++;
res.write(counter.toString() + '\n');
}
}
// create http server
http.createServer(function (req, res) {
var query = require('url').parse(req.url).query;
var app = require('querystring').parse(query).file;
// content header
res.writeHead(200, {'Content-Type': 'text/plain'});
if (!app){
res.end();
console.log('No file argument found in query string.');
return;
}else{
app = app + ".txt";
}
// write out numbers
writeNumbers(res);
// timer/timeout to open file and read contents
setTimeout(function() {
console.log('Opening file: ' + app + '.');
// open and read in file contents
fs.readFile(app, 'utf8', function(err, data) {
res.write('\r\n');
if (err)
res.write('Could not find or open file ' + app + ' for reading.\r\n');
else {
res.write(data);
}
// response is done
res.end();
});
},2000);
}).listen(8124);
console.log('Server running at 8124');
客户端:
var http = require('http');
var N = 200;
// The URL we want, plus the path and options we need
var options = {
host: 'localhost',
port: 8124,
path: '/?file=automatic',
method: 'GET'
};
var callback_function = function(response) {
// finished? ok, write the data to a file
console.log('got response back');
};
for (var i = 1; i <= N; i++) {
// make the request, and then end it, to close the connection
http.request(options, callback_function).end();
console.log('done with call # ' + i);
}
---实验完成---
如果我将N降低到10并且如果我做了一个
全局“var i = 1”然后做这件事:
function schedule(){
http.request(options, callback_function).end();
console.log('done with call ' + i);
i++;
if (i<=N){
setTimeout(function(){
schedule();
}, 1000);
}
}
schedule();
而不是客户端中的循环,我得到类似的行为
我猜这就是Milimetric所谓的“睡眠”,即只是
确保我没有太快打中服务器
许多同时请求。
但行为并不完全相同,需要几分钟 在第二组5个请求上打印“得到回复” 然后另一个可能5-6分钟让客户退出。 尽管如此,对我来说这一切看起来都很奇怪。
C:\PERSONAL\NODE_TEST>node test004.js
done with call 1
got response back
done with call 2
got response back
done with call 3
got response back
done with call 4
got response back
done with call 5
got response back
done with call 6
done with call 7
done with call 8
done with call 9
done with call 10
got response back
got response back
got response back
got response back
got response back
C:\PERSONAL\NODE_TEST>
答案 0 :(得分:1)
问题是客户端没有使用服务器发送的响应主体,因此连接保持(一半)打开,http代理默认只允许每个客户端5个并发请求,导致它在5个请求后挂起。连接最终会超时,导致接下来的5个请求被处理。
node.js http.get hangs after 5 requests to remote site
更改您的回调函数以使用在响应中发送的任何数据。
var callback_function = function(response) {
// finished? ok, write the data to a file
console.log('got response back');
response.on('data', function () {});
};