什么是长轮询,Websockets,服务器发送事件(SSE)和Comet?
我曾尝试阅读一些文章,但是我对这些概念还不是很清楚。
会有人喜欢向我解释这些技术是什么:
- 长轮询
- 服务器发送的事件
- 的WebSockets
- 彗星
我每次遇到的一件事是,服务器保持连接打开并将数据推送到客户端。 连接如何保持开放,客户如何获得推送的数据? (客户如何使用这些数据,也许有些代码可能有帮助?)
现在,我们应该使用哪一个实时应用程序。 我一直听到很多有关websockets(与socket.io [一个node.js库]),但为什么不是PHP?
在下面的例子中,客户端是浏览器,服务器是托pipe网站的networking服务器。
在您理解这些技术之前,您必须首先了解传统的 HTTP Web通信。
普通的HTTP:
- 客户端从服务器请求网页。
- 服务器计算响应
- 服务器将响应发送给客户端。
Ajax轮询:
- 客户端使用普通的HTTP请求服务器的网页(请参阅上面的HTTP)。
- 客户端接收请求的网页,并在定期(例如0.5秒)从服务器请求文件的页面上执行JavaScript。
- 服务器计算每个响应并将其发回,就像正常的HTTPstream量一样。
Ajax长轮询:
- 客户端使用普通的HTTP请求服务器的网页(请参阅上面的HTTP)。
- 客户端接收请求的网页,并在从服务器请求文件的页面上执行JavaScript。
- 服务器不会立即响应请求的信息,而是等待有新的信息可用。
- 当有新的信息可用时,服务器回应新的信息。
- 客户端收到新的信息,并立即发送另一个请求到服务器,重新启动过程。
HTML5服务器发送事件(SSE)/事件源:
- 客户端使用普通的HTTP请求服务器的网页(请参阅上面的HTTP)。
- 客户端收到请求的网页,并在打开与服务器的连接的页面上执行JavaScript。
-
当有新的信息可用时,服务器向客户端发送一个事件。
- 从服务器到客户端的实时stream量,大部分是您需要的
- 您将需要使用具有事件循环的服务器
- 无法连接到另一个域的服务器
- 如果你想阅读更多,我发现这些非常有用:( 文章) , (文章) , (文章) , (教程) 。
HTML5 Websockets:
- 客户端使用普通的http请求一个服务器的网页(见上面的HTTP)。
- 客户端收到请求的网页,并在与服务器打开连接的页面上执行JavaScript。
-
当新数据(任何一方)可用时,服务器和客户端现在可以相互发送消息。
- 从服务器到客户端以及从客户端到服务器的实时stream量
- 您将需要使用具有事件循环的服务器
- 使用WebSockets,可以从另一个域连接一台服务器。
- 也可以使用第三方托pipe的websocket服务器,例如Pusher或其他 。 这样你只需要实现客户端,这很容易!
- 如果你想阅读更多,我发现这些非常有用:( 文章 ), (文章) ( 教程 )。
彗星:
Comet是HTML5之前的技术集合,它使用stream和长轮询实现实时应用程序。 阅读更多关于维基百科或这篇文章。
现在,他们中的哪一个应该用于实时应用程序(我需要编码)。 我一直听到很多有关websockets(与socket.io [一个node.js库]),但为什么不是PHP?
你可以用WebSockets来使用PHP,看看棘轮 。
Tieme为他的优秀答案付出了很多努力,但我认为OPs的核心问题是这些技术如何与PHP相关,而不是每种技术如何工作。
除了明显的客户端html,css和javascript之外,PHP是web开发中使用最多的语言。 然而PHP在实时应用程序方面有两个主要问题:
1)PHP开始是一个非常基本的CGI。 从早期阶段开始,PHP已经进步很远,但是它发生在很小的一步。 当PHP成为今天embedded式和灵活的C库的时候,PHP已经拥有了数以百万计的用户,其中大部分用户都依赖于早期的执行模式,所以还没有做出可靠的尝试来逃避内部的CGI模型。 即使命令行界面调用PHP库(Linux上的libphp5.so,Windows上的php5ts.dll等),就好像它仍然是一个处理GET / POST请求的CGI。 它仍然执行代码,就好像它只需构build一个“页面”,然后结束它的生命周期。 因此,对于multithreading或事件驱动的编程(在PHP用户空间中)几乎没有支持,使得它对于实时的多用户应用程序来说目前是不切实际的。
请注意,PHP的扩展可以在PHP用户空间中提供事件循环(比如libevent)和线程(比如pthread),但是很less有应用程序使用这些扩展。
2)PHP仍然有垃圾收集的重大问题。 虽然这些问题一直在改进(可能是如上所述结束生命周期的最大步骤),但即使是创build长时间运行的PHP应用程序的最佳尝试也需要定期重新启动。 这也使得它不适合实时应用程序。
PHP 7将是解决这些问题的一个很好的步骤,并且作为实时应用程序的平台,它似乎非常有前景。
我试图做一些关于这些的logging,并从java的angular度收集和编写示例。
适用于Java开发人员的HTTP
反向Ajax – 旧式
服务器端的asynchronous处理
反向Ajax – 新风格
服务器发送的事件
把它放在任何正在研究相同主题的Java开发人员。