[http]当content-length未指定时,如何识别流的结束



首先让我展示一下我的代码。

http=require("http");
fs=require("fs");
var server=http.createServer(function(req,res){
    var readStream=fs.createReadStream("1.jpg");
    readStream.on("data",function(data){
        res.write(data);
    });
    readStream.on("end",function(data){
        res.write("this string seems not to be sent","utf8");
        res.end("end","utf8");
    });
});
server.listen(3000);

我创建了图片1.jpg的readStream,然后发送数据流。在"end"事件被触发后,我发送了一个字符串"这个字符串似乎没有被发送"。我没有在header中指定内容长度。

在客户端,我实际上得到了正确的1.jpg。但是我没有收到那个字符串。我想一定有什么东西标志着小溪的尽头。如果是的话,这个分数是多少?它是如何工作的?

我知道用"分块"分配传输编码是发送长度不确定的数据的一种方式,但我的safari显示响应头是:


连接维生传输编码标识

在客户端,我实际上得到了正确的1.jpg。但是我没有收到字符串。

实际上,字符串发送的。要确认这个:

$ echo '(Contents of a JPEG file.)' >1.jpg
$ curl -i http://localhost:3000/
HTTP/1.1 200 OK
Date: Sat, 23 May 2015 08:01:48 GMT
Connection: keep-alive
Transfer-Encoding: chunked
(Contents of a JPEG file.)
this string seems not to be sentend

您的浏览器(或图像查看器)理解JPEG的格式,因此它忽略末尾的额外字符串。但是,它被发送了。

我猜一定有什么东西标志着流的结束。

是的。数据由分块传输编码标记分隔。curl默认不显示它们,但它们存在。要在响应中查看它们:

$ curl -i --raw http://localhost:3000/
HTTP/1.1 200 OK
Date: Sat, 23 May 2015 08:23:02 GMT
Connection: keep-alive
Transfer-Encoding: chunked
1b
(Contents of a JPEG file.)
20
this string seems not to be sent
3
end
0

相关内容

  • 没有找到相关文章

最新更新