代码之家  ›  专栏  ›  技术社区  ›  Alexander Arendar

需要澄清与渡槽有关的流响应

  •  0
  • Alexander Arendar  · 技术社区  · 5 年前

    我在读渡槽HTTP web服务器的文档。 在关于 streaming 我发现以下两个陈述不完全适合我:

    物体也可以是 Stream<T> . 身体物体是 通常在提供文件时使用。这允许文件的内容 从磁盘流式传输到HTTP客户端,而不必加载 先把整个文件放入内存。

    当一个物体是 流<T> ,直到 溪流已关闭。对于有限的溪流-就像那些来自

    那么,它如何在整个文件被读取之后才发送响应,而不必先将整个文件加载到内存中呢?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Joe Conway    5 年前

    这是一个很好的问题,文件中的措辞可以改进。重要的代码在这里: https://github.com/stablekernel/aqueduct/blob/master/aqueduct/lib/src/http/request.dart#L237 .

    传出的HTTP响应也是一个流。当您向该流写入字节时,字节将通过线路传输(如果您启用了缓冲(默认情况下为启用状态),则在发送之前会建立一个缓冲区;IIRC默认情况下为8kb)。

    您的源流(表示您的body对象的流)通过管道传输到HTTP响应流(如果适用,在被任何编解码器转换之后)。一旦从控制器返回响应对象,就开始使用源流。在源流指示“已关闭”之前,无法完成响应。如果你偷看一下 FileController ,可以看到它使用 File.openRead ,它在读取所有字节后自动关闭源流。

    Response 对象,然后异步向流中添加字节,并在完成后将其关闭。关键是,如果您拥有流,则需要关闭它,系统实用程序通常会为您关闭流。希望这能回答这个问题。