node中response在触发end()的时候才会发数据到客户端吗?
发布于 8 年前 作者 zhoushx3 3952 次浏览 来自 问答
var http = require('http');
var fs = require('fs');

var server = http.createServer(function (req, res) {
    var stream = fs.createReadStream(__dirname + '/data.txt');
    stream.pipe(res);
});
server.listen(8000);

这段代码是在stream-handbook中摘取的,带有下面这句解释:

now the data.txt file will be written to clients one chunk at a time immediately as they are received from the disk.

我的疑问是:response在接收到每一个小chunk之后,会立即发往客户端吗?不是在response.end时候才一起发往客户端的吗? 如果是前者,那浏览器会怎么处理这些小chunk,会跟bigpipe的处理方式一样吗?

2 回复

我的理解 end 是结束掉这次请求。其实具体要看http的协议定义。

在tcp中res接收到的小数据,一般会被算法优化,默认中这个算法是开启的。这个算法主要是将缓冲区的数据存到一定量的时候或者一段时间后再进行发出,以此类推,数据大的时候,可能会多次发出,而且不是立即。http协议是在tcp构建的,估计差不多吧… - -!

回到顶部