为了账号安全,请及时绑定邮箱和手机立即绑定

服务器发起的请求

服务器发起的请求

Go
GCT1015 2021-10-18 10:06:55
我知道 HTTP 是一种请求-响应协议。简而言之,我的问题是客户端向服务器发出请求以启动一个长时间运行的进程,我想用包含进度信息的简单 JSON 消息通知客户端进度。在 HTTP/1.1 中,我知道我可以使用 WebSocket 或服务器发送事件 (SSE) 或长轮询。现在我知道 HTTP/2 还不支持 WebSocket。我的问题是,通过 HTTP/2 处理此类事情的最佳方法是什么?在 HTTP/2 中处理服务器发起的请求有什么我不知道的新东西吗?如果这很重要,我正在使用 Go 语言。
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

如果您想以文本形式发送 JSON 消息,服务器发送事件 (SSE)是一种很好的方法。SSE 旨在发送文本。所有事件数据都以 UTF-8 字符编码。缺点是这使得通过 SSE 发送二进制数据效率低下。

如果你想发送二进制数据,你可能会对HTTP/2 引入的Server Push机制感兴趣。服务器推送允许 HTTP/2 服务器主动向客户端发送任何类型的文件。它被称为服务器推送“响应”,即使它是在客户端请求之前发送的。客户端自动将通过服务器推送响应发送的文件存储在其缓存中。对文件的后续请求会立即从缓存中得到满足,而无需往返服务器。

这是将二进制数据推送到 Web 浏览器的有效方法。问题在于,当服务器推送响应到达时,浏览器的文档对象模型 (DOM) 没有得到通知。浏览器只有在发出请求时才会发现数据在其缓存中。我们可以通过以下方式解决此问题。在使用 Server Push 发送二进制数据后,服务器立即向客户端发送 SSE,以通知它数据已被推送到其缓存中。现在客户端可以通过请求从它的缓存中检索数据。

但是只要您使用的是 SSE,为什么不首先通过 SSE 发送文件呢?因为如果您正在处理二进制数据,您可以从服务器推送允许您实现的较小文件大小中受益。对于简短的 JSON 消息,使用服务器推送可能没有意义。在您推送二进制数据并且必须节省带宽的情况下,请考虑通过服务器推送发送数据,然后是 SSE 通知。

与轮询不同,这种方法不需要来自客户端的定期请求。服务器可以随时发送服务器推送响应。


查看完整回答
反对 回复 2021-10-18
  • 3 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信