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

标签 node.js stream

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

我最初的感觉是使用cluster模块并 fork {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 个请求同时生效,并且所有请求最终相对同时结束。

关于node.js - 同时向 Node 中的多个客户端提供文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17862494/

相关文章:

node.js - 当第二个读取键取决于第一个读取值时,如何在 Redis 中使两个读取操作原子化?

javascript - 全局变量未在函数内更新

php - get-stream 教程中缺少代码

dart - 是否可以将项目添加到 Dart 中流中包含的列表?

javascript - Javascript中的Javascript模块

node.js - 是否可以在基于 powerpc 的 Linux 上运行 Nodejs?

javascript - 在node js express中将字符串解析为json

java - 使用 java 中的流式传输将嵌套列表映射到 map

c++ - fstream 绝对路径不起作用