提问者:小点点

什么是长轮询,Websockets,服务器发送事件(SSE)和Comet?


我试着读了一些文章,但是我还不是很清楚其中的概念。

有人愿意给我解释一下这些技术是什么吗:

  1. 长轮询
  2. 服务器发送的事件
  3. WebSockets
  4. 彗星

我每次遇到的一件事是,服务器保持连接打开,并将数据推送到客户机。连接如何保持打开,客户端如何获取推送的数据?(客户机如何使用这些数据,也许一些代码会有所帮助?)

现在,我应该使用它们中的哪一个作为实时应用程序。我已经听说了很多关于websockets(带有socket.io[一个node.js库])的事情,但为什么不是PHP呢?


共3个答案

匿名用户

在下面的示例中,客户端是浏览器,服务器是承载网站的Web服务器。

在了解这些技术之前,您得先了解经典的HTTP web流量。

  1. 客户端向服务器请求网页。
  2. 服务器计算响应
  3. 服务器将响应发送到客户端。

  1. 客户端使用常规HTTP(请参阅上面的HTTP)从服务器请求网页。
  2. 客户端接收请求的网页,并在页面上执行JavaScript,该页面以固定的间隔(例如0.5秒)向服务器请求文件。
  3. 服务器计算每个响应并将其发回,就像正常的HTTP通信一样。

  1. 客户端使用常规HTTP(请参阅上面的HTTP)从服务器请求网页。
  2. 客户端接收请求的网页,并在向服务器请求文件的页面上执行JavaScript.
  3. 服务器不会立即响应请求的信息,而是等待,直到有新信息可用。
  4. 当有新信息可用时,服务器将用新信息响应。
  5. 客户端接收新信息,并立即向服务器发送另一个请求,重新启动进程。

>

  • 客户端使用常规HTTP(请参阅上面的HTTP)从服务器请求网页。
  • 客户端接收请求的网页并在打开到服务器的连接的页面上执行JavaScript.
  • 当有新信息可用时,服务器向客户端发送事件。

    • 从服务器到客户端的实时通信,这是您需要的大部分内容
    • 您需要使用具有事件循环的服务器
    • 只有在CORS设置正确的情况下,才能与来自其他域的服务器连接
    • 如果你想读更多,我发现这些非常有用:(文章),(文章),(文章),(教程)。

    >

  • 客户端使用常规http(请参阅上面的http)从服务器请求网页。
  • 客户端接收请求的网页,并在打开与服务器连接的页面上执行JavaScript.
  • 服务器和客户端现在可以在任何一方有新数据可用时相互发送消息。

    • 从服务器到客户端以及从客户端到服务器的实时通信
    • 您需要使用具有事件循环的服务器
    • 使用WebSockets,可以从另一个域连接到服务器。
    • 也可以使用第三方托管的websocket服务器,例如Pusher或其他服务器。这样您只需要实现客户端,这非常容易!
    • 如果你想读更多,我发现这些非常有用:(文章),(文章)(教程)。

    Comet是HTML5之前的一个技术集合,它使用流和长轮询来实现实时应用。在维基百科或本文上阅读更多信息。

    现在,我应该使用其中的哪一个实时应用程序(我需要编码)。我已经听说了很多关于websockets(带有socket.io[一个node.js库])的事情,但为什么不是PHP呢?

    您可以将PHP与WebSockets一起使用,请查看Ratchet。

  • 匿名用户

    Tieme在他出色的回答中投入了大量的精力,但我认为OPs问题的核心是这些技术如何与PHP相关,而不是每种技术如何工作。

    除了显而易见的客户端html,css和JavaScript之外,PHP是web开发中使用最多的语言。然而,当涉及到实时应用程序时,PHP有两个主要问题:

    1)PHP最初是一个非常基本的CGI。PHP自其早期阶段以来已经取得了很大的进展,但进展缓慢。当PHP成为今天这样一个可嵌入且灵活的C库时,它已经拥有了数百万用户,其中大多数用户依赖于它早期的执行模型,因此它还没有在内部尝试摆脱cgi模型。即使是命令行接口也会调用PHP库(linux上的libphp5.so,windows上的php5ts.dll等),就好像它仍然是一个处理GET/POST请求的cgi一样。它仍然执行代码,就好像它只需要构建一个“页面”,然后结束它的生命周期。因此,它对多线程或事件驱动编程的支持非常少(在PHP用户空间内),这使得它目前对于实时,多用户应用程序来说是不实用的。

    注意,PHP确实有扩展,可以在PHP用户空间中提供事件循环(如libevent)和线程(如pthreads),但是使用这些的应用程序非常非常少。

    2)PHP在垃圾收集方面仍然存在重大问题。尽管这些问题一直在不断改善(正如上面所描述的,这可能是结束生命周期的最大步骤),但即使是创建长时间运行的PHP应用程序的最好尝试也需要定期重启。这也使得它对于实时应用程序来说是不实际的。

    PHP7也将是解决这些问题的重要一步,作为实时应用程序的平台似乎非常有前途。

    匿名用户

    我试着记下这些,并从Java的角度收集和撰写例子。

    适用于Java开发人员的HTTP

    反向Ajax-旧样式

    服务器端异步处理

    反向Ajax-新样式

    服务器发送的事件

    把它放在这里,为任何Java开发人员谁正在寻找相同的主题。