node.js - HTTP2 - 如何拥有类似 WebSocket 的功能(Keep-Alive、EventSource 等)

标签 node.js http websocket http2

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

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

Mozilla 说 Keep-Alive不应该在生产中使用,所以想知道它是否仍然适用于 HTTP2。

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

最后,我想要像 WebSockets 这样的双向通信的简单设置,但我不确定 HTTP2 中的最佳实践以及是否应该只使用 WebSockets 来完成。我更愿意在没有 websockets 的情况下尝试这样做。

最佳答案

恕我直言,我认为您错误地认为 HTTP/2 连接是特定于页面的。

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

另请参阅讨论 here其中包括关于为什么 HTTP/2 不能(或不应该)用作 Websocket 替代品的无数原因。

另一方面,如果 HTTP/2 被“ promise ”并且 Websockets 不可用,那么轮询可能是一个选项。

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

附言

基于 HTTP/2 的 Websockets

除非 HTTP/1.1 被淘汰,否则这不是问题(事实上,恕我直言,这是有意且好的)。

的确,HTTP/2 连接不能“升级”(更改)为 Websocket 连接,它们也不能隧道 Websocket 数据,但这绝对没有任何意义。

新的 Websocket 连接使用现有的 HTTP/1.1 升级握手,仅此而已。

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

保持事件状态

Mozilla 对非标准 Keep-Alive header 发出警告。但是,绝对推荐 HTTP/1.1 的 Connection: keep-alive 标准(这也是 HTTP/1.1 客户端的默认设置)。

SSE(服务器发送事件)

SSE 早于 Websockets,它们在社区中没有引起太大的关注,而 Websockets 却以复仇的方式被采用。

wondering if there is a way to add client events to send to the server

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

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

关于node.js - HTTP2 - 如何拥有类似 WebSocket 的功能(Keep-Alive、EventSource 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47779909/

相关文章:

node.js - 使用陷阱覆盖 ES6 类行为

javascript - 在 Heroku 部署后,React 客户端在指定本地主机时因 Axios 而失败

c# - 使用 PushStreamContent 从 HTTPClient 上传

apache - 10 个内部重定向 - 可以提高这个限制吗?

c - (libwebsocket) 如何在客户端连接上发送数据包

node.js - Express.js — HTTP 请求期间 RabbitMQ 事件上的 res.send()?

node.js - apm(atom的包管理器)启动shell运行错误

ios - 在 swift iOS 应用程序中将参数发送到套接字

websocket - WebRTC:数据通道可以用于信令吗?

Java Atmosphere Jersey 从 Broadcastable 返回 JSON 对象