当前位置: 首页 > 知识库问答 >
问题:

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

子车雅珺
2023-03-14

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

有人会强调这些技术吗(也许还有其他一些推动技术。)这符合我的问题,哪一种情况更适合每一种情况?

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

共有1个答案

卫浩瀚
2023-03-14

这篇文章是一个更好的解释,讨论了关于长轮询、Comet、SSE和WebSockets的区别/优势/etc。

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

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

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

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

 类似资料:
  • 为什么每个站点都解释说在SSE中,客户端和服务器之间的单个连接保持打开状态“使用SSE,客户端发送标准HTTP请求请求事件流,服务器最初以标准HTTP响应响应并保持连接打开” 然后,当服务器决定可以向客户端发送数据,而我试图实现SSE时,每隔几秒钟就会看到fiddler请求被发送 对我来说,这感觉就像是长时间的投票,没有一个连接保持打开。 此外,并不是服务器决定向客户机发送数据,而是只有在客户机发

  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

  • 我正在尝试查看从带有Server-Sent事件传输的Signalr服务器发送的保持活动事件。我正在使用Fiddler来查看它,并且我启用了“Stream”Fiddler功能按钮...到目前为止,我没有看到其中任何一个...我正在使用Javascript客户端来正确连接该传输。 为什么我没有在Fiddler上发送任何HTTP消息? 始终考虑到Fiddler正在监视信号服务器所在的HTTP请求/响应。

  • 问题内容: 我想通过HTTP将数据推送到浏览器而不杀死django / python应用程序。 我决定使用彗星服务器,在我的应用程序和客户端之间代理请求(尽管我仍然没有真正弄清楚它)。 我研究了以下引擎:轨道彗星ejabberd码头 有没有人有使用这些服务器和部署它们的经验?关于这些主题的任何见解和链接都将很棒。谢谢。 问题答案: 我建议您在divmod中研究Twisted,twisted.web

  • 问题内容: 所以现在,我正在制作一个基于客户端服务器应用程序的多线程。在服务器端,我为接受的每个连接创建了一个线程。 在线程类中,我创建了一种将命令发送到客户端的方法。我只想要的是如何将参数发送到所有正在运行的客户端?为简单起见,我只想使此服务器向所有连接的客户端发送消息。 我已经阅读了这篇文章,并从此链接中找到方法。但是,当我尝试使用自己的代码时,中没有类似的方法。 好的,这是我的服务器和线程示