服务器客户端通信:长轮询、彗星和服务器发送事件 (SSE)

Posted

技术标签:

【中文标题】服务器客户端通信:长轮询、彗星和服务器发送事件 (SSE)【英文标题】:Server client communication: Long Polling, Comet, & Server-sent Events (SSE) 【发布时间】:2012-06-03 17:50:46 【问题描述】:

我正在开发一个连接到服务器的 Web 应用程序,我需要服务器在给定时间向客户端推送一些信息。

因此,我开始阅读有关服务器发送事件 (SSE) 的信息,因为该网站是基于 html5 开发的,而 SSE 似乎符合我的要求。但是当我读到 SSE 真正做的是从客户端发送请求而不是相反的方式时,我感到非常惊讶(昨天我想我明白长轮询是一种推送仿真)。因此,我开始阅读有关 Web 套接字的信息(但似乎该标准仍是草案),并且还查看了 Comet。但我想我不能把所有的部分都放在我的脑海里。

是否有人会强调这些技术(可能还有其他一些推动技术)适合我的问题以及哪种情况更适合每种技术?

非常感谢,我想我完全迷失了这个领域。

【问题讨论】:

【参考方案1】:

这个post 是一个更好的解释,讨论了关于 Long Polling、Comet、SSE 和 WebSockets 的区别/优势/等。

在大多数情况下,客户端通常必须向服务器发出第一个请求以建立连接。一旦建立连接,服务器就可以将数据推送到客户端。所以即使使用WebSockets,客户端也会向服务器发出初始请求,以在两者之间建立可靠的连接。

Server-Sent Events 使用普通的 HTTP GET 请求来建立与服务器的连接。它也是客户端的只读连接。它的好处是易于实现,因为我们不必定义新协议。问题是 HTTP 连接,即使是持久连接,也会在大约 15 秒后被大多数 Web 服务器关闭。即使对于长期存在的请求,Web 服务器通常也会在超时之后关闭连接。这就是长轮询的想法出现的地方。这是一个简单的想法,我们向服务器发出正常的 ajax 请求,服务器尽可能长时间地保持打开状态。如果请求因某种原因被服务器关闭,您会立即再次发出相同的请求。您可以使用 Node.js 之类的服务器和来自浏览器的正常 Ajax 请求轻松实现长轮询机制(即 Comet)。服务器发送事件尝试使用EventSource 抽象出浏览器端的实现。因此,您不必为长轮询/彗星实现浏览器/客户端代码,浏览器会为您处理这个。它为看似持久的连接提供了一个很好的抽象。您的网络服务器只需要查找在标头中将 Content-Type 指定为“text/event-stream”的 GET 请求,并尽可能长时间地保持 HTTP 连接打开。

我建议您不要过度复杂化什么是服务器发送事件。如果您理解一个普通的 HTTP GET 请求,那么您可能已经对其背后的想法有 90% 的理解。

SSE/Comet 与传统的长轮询之间有一个区别可能值得强调。根据我的经验,长轮询背后的想法是,在您获得更新之前,您的请求不会返回。此时 HTTP 连接关闭,随后立即发出另一个请求。使用 SSE,尽管您可以在发送更新的消息后立即关闭 HTTP 连接,但您的目标是将数据从服务器刷新到客户端,而无需实际关闭/结束 HTTP 请求。这避免了实际发出 GET 请求的开销。这可以通过常规的 ajax 请求来实现,但 SSE 再次通过 EventSource 提供了一个很好/高效的实现。

编辑:澄清 SSE 和长轮询之间的区别。

【讨论】:

以上是关于服务器客户端通信:长轮询、彗星和服务器发送事件 (SSE)的主要内容,如果未能解决你的问题,请参考以下文章

WEB揭秘之长连接,短连接,长轮询,短轮询

Web 通信 之 长连接长轮询(转)

.NETCOREASP.NET Core SignalR

Web 套接字、长轮询、服务器发送事件和永久帧之间有啥区别?

Web 通信 之 长连接长轮询(long polling)

Web 通信 之 长连接长轮询(long polling)(转载)