我可以使用http2将响应stream式传输回浏览器吗?

是否有可能从浏览器,也许使用http2stream回应答?

在我的networking应用程序中,用户按下了一个启动服务器进程的button。 此过程可能需要10分钟或更长时间才能完成。 我想将状态更新传回给客户端/浏览器。

我相信我可以用websockets做到这一点,但是我希望http2有一些东西可以使这个更容易。 我知道它支持“推”,但据我所知,这只是推送用户将来可能需要的文件。

或者,也许我甚至不需要http2? 浏览器保持连接多长时间? 我可以无限期地保持res.write()吗?

原则上,您可以使用任何HTTP版本将数据从服务器传输到客户端,只需通过在响应主体内发送数据片段即可。 然而,当前的浏览器HTTP API(XHR和提取)还不允许以stream方式读取响应主体,而是会缓冲整个响应(这对于无限stream是没有意义的)。 将来,当获取API的stream式传输function完全可用时,将可能使用stream式响应主体,请参阅: https : //www.chromestatus.com/feature/5804334163951616您可以在Chrome上使用它,但到目前为止据我所知,它还没有完全标准化和广泛可用。

这个通用规则的一个例外是服务器发送事件(SSE),这是来自浏览器的HTTP响应,它遵循定义良好的变换编码( text/event-stream )。 浏览器支持SSE API以处理SSE响应,并且SSE API允许您为每个接收到的数据块获取事件。 该API相当简单,你不需要发明自己的分块机制,所以它可能是你的应用程序的一个很好的select。

关于HTTP / 1.1和HTTP / 2:你可以观察到的主要差异是可以使用它们创build的并发stream的数量。 对于HTTP / 1.1,每个stream都需要一个完整的TCP连接,浏览器限制连接到远程主机(我认为不到10个)。 所以创build50个SSEstream是不可能的 – 我会更进一步,并且会说你可能应该只使用一个SSEstream,并把所有的事件数据。 另一方面,HTTP / 2允许在单个TCP连接上复用大量的HTTP请求(从而也是stream式传输的主体响应),这意味着拥有更多数量的并发SSEstream在这里不是什么问题。