mpe*_*pen 2 node.js express http2
是否可以使用 http2 将响应从节点流式传输回浏览器?
在我的网络应用程序中,用户按下启动服务器进程的按钮。此过程可能需要 10 分钟或更长时间才能完成。我想将状态更新流回客户端/浏览器。
我相信我可以用 websockets 来做到这一点,但我希望 http2 能让这更容易。我知道它支持“推送”,但据我所知,这仅用于推送用户将来可能需要的文件。
或者我什至不需要http2?浏览器将保持连接打开多长时间?我res.write()可以无限期地坚持下去吗?
原则上,您可以使用任何 HTTP 版本将数据从服务器流式传输到客户端,只需在响应正文中仅发送数据片段即可。然而,当前的浏览器 HTTP API(XHR 和 fetch)还不允许以流方式读取响应正文,而是将缓冲整个响应(这对无限流没有意义)。当 fetch API 的流式功能完全可用时,将来可以使用流式响应正文,请参阅:https : //www.chromestatus.com/feature/5804334163951616您已经可以在 Chrome 上使用它,但到目前为止据我所知,它还没有完全标准化和广泛可用。
此通用规则的一个例外是服务器发送事件 (SSE),它们是来自浏览器的 HTTP 响应,它们遵循明确定义的转换编码 ( text/event-stream)。浏览器支持 SSE API 以处理 SSE 响应,并且 SSE API 允许您为每个接收到的数据块获取一个事件。API 相当简单,您不需要发明自己的分块机制,因此它可能是您的应用程序的不错选择。
关于 HTTP/1.1 和 HTTP/2:您将观察到的主要区别在于您可以使用它们创建的并发流的数量。对于 HTTP/1.1,每个流都需要一个完整的 TCP 连接,浏览器限制到远程主机的连接(我认为少于 10 个)。所以创建 50 个 SSE 流是不可能的——我会更进一步,说你可能应该只使用一个 SSE 流并将所有事件数据放入其中。另一方面,HTTP/2 允许在单个 TCP 连接上多路复用大量 HTTP 请求(从而也流式传输主体响应),这意味着拥有更多并发 SSE 流不是问题。
| 归档时间: |
|
| 查看次数: |
1862 次 |
| 最近记录: |