Node.js 同时向节点中的多个客户端提供文件

Node.js 同时向节点中的多个客户端提供文件,node.js,stream,Node.js,Stream,我正在构建一个简单的HTTP服务器,为使用流的客户端提供相当大的文件。我需要同时为多个客户服务,我想知道实现这一点最简单的方法是什么 我最初的感觉是,使用集群模块和forking{num CPUs}进程可能是最简单的方法 var StreamBrake = require('streambrake'); var http = require('http'); var fs = require('fs'); var server = http.createServer(function(req,

我正在构建一个简单的HTTP服务器,为使用流的客户端提供相当大的文件。我需要同时为多个客户服务,我想知道实现这一点最简单的方法是什么

我最初的感觉是,使用
集群
模块和forking{num CPUs}进程可能是最简单的方法

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个请求都同时处于活动状态,并且所有请求都以相对同步的方式结束。

思考您的问题后,我不明白您为什么认为存在问题。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个请求都同时处于活动状态,并且最终都会以相对同步的方式结束。

我很想看到答案,我想知道流式播客音频的这一点。理想情况下,您可以通过一个
fs
调用来缓冲多人同时接收的部分文件。您可以定义“相当大”吗。我想我真正想说的是,有没有什么理由你不能缓存这个文件?整个问题是由一个奇怪的问题引起的,Chrome没有在第一个连接还在等待的时候建立第二个
localhost
连接-有人知道如何防止吗?(比如说Safari很好,curl也很好)我很想知道答案,我想知道流式播客音频的这一点。理想情况下,您可以通过一个
fs
调用来缓冲多人同时接收的部分文件。您可以定义“相当大”吗。我想我真正想说的是,有没有什么理由你不能缓存这个文件?整个问题是由一个奇怪的问题引起的,Chrome没有在第一个连接还在等待的时候建立第二个
localhost
连接-有人知道如何防止吗?(比如Safari就可以了,就像curl一样)我的代码也没有问题。整个问题都是由一个奇怪的问题引起的,Chrome没有在第一个连接还在等待时建立第二个
localhost
连接,有人知道如何防止吗?(以Safari为例就可以了,curl也是一样)。我的代码也没有问题。整个问题都是由一个奇怪的问题引起的,Chrome没有在第一个连接还在等待时建立第二个
localhost
连接,有人知道如何防止吗?(比如说Safari就可以了,就像
curl
一样)。