HTTP2 - 如何具有类似WebSocket的功能(Keep-Alive,EventSource等)

时间:2017-12-12 19:10:31

标签: node.js http websocket http2

想知道如何在Node.js中设置客户端和服务器之间的持久连接。

持久连接应该能够从双方来回发送请求。看起来它需要有一个用于描述每个请求的机制,例如\r\n如果请求是JSON,但如果之前已经完成,则不确定这里有哪些最佳实践。想知道网络套接字如何处理这个问题。

Mozilla说Keep-Alive不应该用于制作,所以想知道这是否仍然适用于HTTP2。

使用EventSource,您可以接收服务器事件,但想知道是否有办法添加客户端事件以发送到服务器。

最后,我想对WebSockets之类的双向通信进行简单的设置,但我不确定HTTP2中的最佳实践以及是否应该使用WebSockets。我宁愿尝试在没有websockets的情况下这样做。

1 个答案:

答案 0 :(得分:3)

在充分尊重的情况下,我相信您错误地认为HTTP / 2连接是特定于页面的。

实际上,HTTP / 2连接通常是浏览器范围的连接。 HTTP / 2 push无法知道哪个页面/选项卡将使用这些数据(可能不止一个)。

另外,请参阅讨论here,其中包含了为什么HTTP / 2不能(或不应该)用作Websocket备选方案的原因。

另一方面,如果HTTP / 2是“承诺”而Websockets不可用,则轮询可能是一种选择。

使用HTTP / 2进行轮询将比使用HTTP / 1.1进行轮询更加资源友好,即使由于额外的头和身份验证数据,它仍然比Websocket推送(或轮询)昂贵得多(它也会减少)安全,但这可能是没有人真正关心的事情。)

P.S。

HTTP / 2上的Websockets

这是一个非问题,除非HTTP / 1.1退役(事实上,恕我直言,这是故意和良好的)。

HTTP / 2连接无法“升级”(更改)为Websocket连接,也无法隧道传输Websocket数据,但这绝对没有任何意义。

新的Websocket连接使用现有的HTTP / 1.1升级握手,就是这样。

任何支持Websockets的HTTP / 2服务器都支持握手。

<强>保持活动

Mozilla警告非标准Keep-Alive 标题。但是,绝对建议使用HTTP / 1.1的Connection: keep-alive标准(这也是HTTP / 1.1客户端的默认值)。

SSE (服务器已发送事件)

SSE之前的Websockets并没有在社区中获得太大的吸引力,而Websockets被采用复仇。

  

想知道是否有办法添加客户端事件以发送到服务器

简单 - 发送HTTP请求。可以使用SSE异步接收回复。

我更喜欢Websockets。就服务器端而言,我发现它们更易于管理和编码。