2017-02-20 38 views
1

是否有可能将响应流回浏览器,从节点,也许使用http2?我可以使用http2将响应流式传输回浏览器吗?

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

我相信我可以用websockets做到这一点,但我希望http2能够让这件事变得更容易。我知道它支持“推送”,但据我所知,这仅仅是推送用户将来可能需要的文件。

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

+1

您可能想要使用[SSE](https://en.wikipedia.org/wiki/Server-sent_events)。我不认为HTTP/2与HTTP/1.1在这里是相关的。 – kennytm

+0

@kennytm哦,这听起来很有希望。谢谢! – mpen

回答

2

原则上,只需在响应主体内发送数据片段,就可以使用任何HTTP版本将数据从服务器传输到客户端。然而,当前的浏览器HTTP API(XHR和提取)不允许以流方式读取响应主体,而是会缓冲整个响应(这对无限流无效)。未来,当获取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流在那里没有问题。

+0

感谢您的好信息!我刚刚尝试过使用SSE,并且迄今取得了巨大成功。甚至比我所希望的更好,我可以将进度报告发送给打开网页的任何人!无需websockets的实时监控。 NEATO! – mpen

相关问题