我正在构建一个简单的HTTP服务器,它使用流向客户端提供相当大的文件。我需要同时为多个客户提供服务,我想知道实现这一点最简单的方法是什么
我最初的感觉是,使用cluster
模块和分叉{numCPU}进程可能是最简单的方法。
var StreamBrake = require('streambrake');
var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req, res) {
var stream = fs.createReadStream('/data/somefile');
stream.pipe(new StreamBrake(10240)).pipe(res);
});
server.listen(1234, 10);
编辑:要澄清的是,在完成对第一个客户端的服务之前,此代码不会开始为第二个客户端提供服务。
思考了您的问题后,我很困惑您为什么认为存在问题。CreateReadStream是异步的。下面的例子使代码稍微复杂了一点,以证明使用CreateReadStream我们确实可以一次服务多个连接。
/*jshint node:true*/
var http = require('http');
var fs = require('fs');
var activeRequests = 0;
var launchFiveRequests = 5;
http.createServer(function (req, res) {
activeRequests++;
console.log('Request received');
var readStream = fs.createReadStream('play.js', {'bufferSize': 1024});
readStream.setEncoding('utf8');
readStream.on('data', function (data) {
console.log(activeRequests);
res.write(data);
});
readStream.on('end', function () {
res.end();
console.log('end');
activeRequests--;
});
}).listen(8080);
var options = {
hostname: 'localhost',
port: 8080,
path: '/'
};
while(launchTenRequests--) {
http.get(options, function(res) {
console.log('response received');
});
}
提供一个足够大的文件,您应该看到所有5个请求都同时存在,并且最终都相对同时结束。