0

我正在通过创建一个基本的 node.js 应用程序代码来测试流式传输,该代码基本上将文件流式传输到响应。使用此处此处的代码。

但是,如果我从 发出请求http://127.0.0.1:8000/,然后打开另一个浏览器并请求另一个文件,则第二个文件将在第一个文件完成之前不会开始下载。在我的示例中,我创建了一个 1GB 的文件。dd if=/dev/zero of=file.dat bs=1G count=1

但是,如果我在第一个文件正在下载时再请求三个文件,则在第一个文件完成后,这三个文件将同时开始下载。

如何更改代码以便它响应每个请求,而不必等待当前下载完成?

var http = require('http');
var fs = require('fs');
var i = 1;

http.createServer(function(req, res) {

    console.log('starting #' + i++);
    // This line opens the file as a readable stream
    var readStream = fs.createReadStream('file.dat', { bufferSize: 64 * 1024 });

    // This will wait until we know the readable stream is actually valid before piping
    readStream.on('open', function () {
        console.log('open');
        // This just pipes the read stream to the response object (which goes to the client)
        readStream.pipe(res);
    });

    // This catches any errors that happen while creating the readable stream (usually invalid names)
    readStream.on('error', function(err) {
        res.end(err);
    });
}).listen(8000);

console.log('Server running at http://127.0.0.1:8000/');
4

1 回答 1

1

您的代码看起来不错。我通过在多个学期会话中提出一些请求,使用节点 v0.10.3 对其进行了检查:

$ wget http://127.0.0.1:8000

两个请求同时运行。使用两种不同的浏览器(即 Chrome 和 Safari)时,我得到了相同的结果。此外,只需稍微更改请求 url,我就可以在 Chrome 中获得并发下载,如下所示:

http://localhost:8000/foo

http://localhost:8000/bar

当从同一个浏览器同一个 url发出多个请求时,您描述的行为似乎很明显。

这可能是浏览器限制 - 看起来第二个请求甚至在第一个请求完成或取消之前都没有发出。

回答您的问题,如果您需要在浏览器中下载多个客户端

  1. 确保您的服务器代码实现了文件到 URL 的映射是一对多的(即使用通配符)。
  2. 确保您的客户端代码(即浏览器中的 javascript)对每个请求使用不同的 url。
于 2013-04-19T23:48:32.067 回答