在什么情况下,AJAX长/短轮询比HTML5 WebSockets更受欢迎?

我正在为朋友构build一个小型聊天应用程序,但不确定如何及时获取信息,而不是像手动或基本不强迫刷新页面一样。

目前,我正在使用简单的AJAX来实现这个function,但是这有一个缺点,就是在短暂的计时器耗尽之后,会定期打到服务器。

在研究长/短轮询时,我碰到了HTML5 WebSockets。 这似乎很容易实现,但我不确定是否有一些隐藏的缺点。 例如,我认为WebSockets只支持某些浏览器。 WebSockets还有其他的缺点,我应该知道吗?

既然看起来两种技术都是一样的,那么在哪种情况下,人们更喜欢使用一种技术呢? 更具体地说,HTML5 WebSockets是否使得AJAX长/短轮询过时,或者有更好的理由来selectAJAX而不是WebSockets?

WebSockets绝对是未来。

长轮询是一个肮脏的解决方法,以防止像AJAX那样为每个请求创build连接 – 但是当WebSocket不存在时创build了长轮询。 现在由于WebSockets,长时间轮询正在消失。

WebRTC允许点对点通信。

我build议学习WebSockets 。

比较:

networking上不同的通信技术

  • AJAXrequestresponse 。 创build与服务器的连接,发送包含可选数据的请求标头,从服务器获取响应并closures连接。 在所有主stream浏览器均支持。

  • 长时间轮询requestwaitresponse 。 像AJAX一样创build一个到服务器的连接,但是维持一个保持连接状态的连接已经打开了一段时间(不久)。 在连接期间,开放客户端可以从服务器接收数据。 连接closures后,客户端必须定期重新连接,因为超时或数据。 在服务器端,它仍然像HTTP请求一样被处理,除了AJAX请求的答案将会发生在现在或将来发生,由应用程序逻辑定义。 支持图表(全) | 维基百科

  • WebSocketsclientserver 。 创build到服务器的TCP连接,并根据需要保持打开状态。 服务器或客户端可以轻松closures连接。 客户端通过HTTP兼容的握手过程。 如果成功,则服务器和客户端可以随时双向交换数据。 如果应用程序需要双向频繁的数据交换,则效率很高。 WebSockets确实有数据成帧,包括从客户端发送到服务器的每个消息的掩码,所以数据被简单地encryption。 支持图表(非常好) | 维基百科

  • WebRTC – peer↔peer。 传输来build立客户端之间的通信,并且与传输无关,所以它可以使用UDP,TCP或更多的抽象层。 这通常用于大容量数据传输,例如video/audiostream传输,其中可靠性是次要的,可以牺牲less数几帧或降低质量进程,有利于响应时间和至less一些数据传输。 双方(同行)可以独立推送数据。 虽然它可以完全独立于任何集中式服务器,但仍需要某种交换endPoints数据的方法,在大多数情况下,开发人员仍然使用集中式服务器来“链接”对等方。 这只需要交换build立连接的基本数据,之后不需要中央服务器。 支持图表(中) | 维基百科

  • 服务器发送的事件clientserver 。 客户端与服务器build立持续的长期连接。 只有服务器可以发送数据给客户端。 如果客户想要将数据发送到服务器,则需要使用另一种技术/协议来这样做。 这个协议是HTTP兼容的,并且在大多数服务器端平台上很容易实现。 这是一个更好的协议来代替长轮询。 支持图表(好,除了IE) | 维基百科

优点:

WebSocket服务器端的主要优点是它不是一个HTTP请求(在握手之后),而是一个适当的基于消息的通信协议。 这使您能够获得巨大的性能和架构优势 。 例如,在node.js中,可以为不同的套接字连接共享相同的内存,因此它们都可以访问共享variables。 因此,您不需要在中间使用数据库作为交换点(如使用AJAX或使用PHP等语言进行长轮询)。 您可以将数据存储在RAM中,甚至可以立即在套接字之间重新发布。

安全考虑

人们经常关心WebSocket的安全性。 事实上,它几乎没有什么区别,甚至把WebSocket作为更好的select。 首先,使用AJAX, MITM有更高的机会,因为每个请求都是一个新的TCP连接,正在穿越互联网基础设施。 对于WebSocket,一旦连接,在两者之间进行截取就更具挑战性,而当数据从客户端传输到服务器时需要额外实施帧掩码以及额外的压缩,这需要更多的努力来探测数据。 所有现代协议都支持:HTTP和HTTPS(encryption)。

PS

请记住,WebSockets通常有一个非常不同的networking逻辑 ,更像实时游戏,而不是像http一样。

您省略的竞争技术是服务器发送的事件/事件源。 什么是长轮询,Websockets,服务器发送事件(SSE)和Comet? 对所有这些都有很好的讨论。 请记住,其中一些比其他服务器更容易集成在服务器端。

对于聊天应用程序或与服务器进行持续对话的任何其他应用程序, WebSockets是最佳select。 但是,只能将WebSockets与支持它们的服务器一起使用,这样如果无法安装所需的库,则可能会限制您使用它们的能力。 在这种情况下,您需要使用Long Polling来获得类似的function。