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

我已经尝试阅读一些文章,但是我对这些概念还不太清楚。

有人想向我解释一下这些技术是什么吗?

  1. 长轮询
  2. 服务器发送的事件
  3. 网络套接字
  4. 彗星

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

现在,我应该为实时应用使用哪一个。我已经听到很多关于 websockets 的信息(使用 socket.io [一个 node.js 库]),但是为什么不使用 PHP?

答案

在下面的示例中,客户端是浏览器,服务器是托管网站的网络服务器。

在理解这些技术之前,您必须首先了解经典的 HTTP Web 流量。

常规 HTTP:

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

HTTP

Ajax 轮询:

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

Ajax轮询

Ajax 长轮询:

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

Ajax长轮询

HTML5 服务器发送事件(SSE)/ EventSource:

  1. 客户端使用常规 HTTP(请参见上面的 HTTP)从服务器请求网页。
  2. 客户端收到请求的网页,并在该页面上执行 JavaScript,以打开与服务器的连接。
  3. 当有新信息可用时,服务器会将事件发送给客户端。

HTML5 SSE

HTML5 Websockets:

  1. 客户端使用常规 http(请参见上面的 HTTP)从服务器请求网页。
  2. 客户端收到请求的网页,并在该网页上执行 JavaScript,以打开与服务器的连接。
  3. 现在,当新数据(在任一侧)可用时,服务器和客户端可以互相发送消息。

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

HTML5 WebSockets

彗星:

Comet 是 HTML5 之前的技术的集合,这些技术使用流传输和长轮询来实现实时应用程序。了解更多关于维基百科文章。


现在,我应该为实时应用使用哪一个(我需要编写代码)。我已经听到很多有关 websockets 的信息(使用 socket.io [一个 node.js 库]),但是为什么不使用 PHP?

您可以将 PHP 与 WebSockets 一起使用,请参阅 Ratchet

Tieme 为他的出色答案付出了很多努力,但我认为 OP 的核心问题是这些技术与 PHP 的关系,而不是每种技术的工作原理。

除了明显的客户端 html,css 和 javascript,PHP 是 Web 开发中最常用的语言。然而,在实时应用程序方面,PHP 存在两个主要问题:

1)PHP 开始是一个非常基本的 CGI。自早期以来,PHP 取得了长足的进步,但是它发生的步伐很小。到今天 PHP 成为可嵌入且灵活的 C 库时,PHP 已经拥有数百万用户,其中大多数人都依赖于它的较早执行模型,因此它尚未做出坚定的尝试来逃避 PHP。内部 cgi 模型。甚至命令行界面也会调用 PHP 库(在 Linux 上为 libphp5.so,在 Windows 上为 php5ts.dll 等),就好像它还是处理 GET / POST 请求的 cgi 一样。它仍然执行代码,就好像只需要构建一个 “页面”,然后结束其生命周期一样。结果,它几乎不支持多线程或事件驱动的编程(在 PHP 用户空间内),因此对于实时的多用户应用程序目前不可行。

注意,PHP 确实具有扩展,可以在 PHP 用户空间中提供事件循环(例如 libevent)和线程(例如 pthread),但是很少有应用程序使用它们。

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

PHP 7 也将是解决这些问题的重要一步,并且作为用于实时应用程序的平台似乎很有希望。

我试图记下这些内容,并从Java 角度收集并编写了示例。

适用于 Java 开发人员的 HTTP

反向 Ajax - 旧样式

服务器端的异步处理

反向 Ajax - 新样式

服务器发送事件

对于正在研究同一主题的所有 Java 开发人员,请放在此处。

您可以轻松地将 Web 应用程序中的 Node.JS 仅用于实时通信。关于 WebSocket,Node.JS 确实非常强大。因此,“通过 Node.js 进行 PHP 通知” 将是一个很好的概念。

请参见以下示例: 使用 PHP 和 Node.js 创建实时聊天应用程序