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

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

目前,我正在使用简单的AJAX实现它,但这有一个缺点,即在短计时器经过时会定期访问服务器。

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

由于似乎这两种技术都做同样的事情,那么在什么样的场景中,人们更愿意使用一种而不是另一种?更具体地说,HTML5 WebSockets是否使AJAX长/短轮询过时了,或者是否有令人信服的理由更喜欢AJAX而不是WebSockets?


答案 1

WebSockets现在绝对是未来

长轮询是一种肮脏的解决方法,可以防止像AJAX那样为每个请求创建连接 - 但是长轮询是在WebSockets不存在时创建的。现在由于WebSockets,长时间的轮询不再消失

WebRTC允许点对点通信。

我建议学习WebSockets

比较:

网络上不同的通信技术

  • 阿贾克斯 - → .创建与服务器的连接,发送包含可选数据的请求标头,从服务器获取响应,然后关闭连接。在所有主流浏览器中均受支持。requestresponse

  • 长民意调查 - → → .像 AJAX 一样创建与服务器的连接,但保持活动状态连接打开一段时间(虽然不会太长)。在连接期间,打开的客户端可以从服务器接收数据。由于超时或数据 eof,客户端必须在连接关闭后定期重新连接。在服务器端,它仍然被视为HTTP请求,与AJAX相同,只是请求应答将在现在或将来的某个时候发生,由应用程序逻辑定义。支持图表(完整)|维基百科requestwaitresponse

  • 网络袜子 - ↔ .创建与服务器的 TCP 连接,并根据需要将其保持打开状态。服务器或客户端可以轻松关闭连接。客户端经历与 HTTP 兼容的握手过程。如果成功,则服务器和客户端可以随时双向交换数据。如果应用程序需要以两种方式频繁地交换数据,则此方法非常有效。WebSockets确实具有数据框架,其中包括从客户端发送到服务器的每条消息的屏蔽,因此数据只是加密。支持图表(很好)|维基百科clientserver

  • WebRTC - ↔ .传输用于在客户端之间建立通信,并且与传输无关,因此它可以使用UDP,TCP甚至更抽象的层。这通常用于大容量数据传输,例如视频/音频流,其中可靠性是次要的,并且可以牺牲几帧或质量进度的降低,以支持响应时间,至少是一些数据传输。双方(对等方)可以独立地将数据推送给对方。虽然它可以完全独立于任何集中式服务器使用,但它仍然需要某种交换端点数据的方法,在大多数情况下,开发人员仍然使用集中式服务器来“链接”对等体。这仅用于交换用于建立连接的基本数据,之后不需要集中式服务器。支持图表(中)|维基百科peerpeer

  • 服务器发送的事件 - ← 。客户端与服务器建立持久和长期的连接。只有服务器可以向客户端发送数据。如果客户端想要将数据发送到服务器,则需要使用其他技术/协议来执行此操作。此协议与 HTTP 兼容,并且易于在大多数服务器端平台中实现。这是一种更可取的协议,用于代替长轮询。支持图表(良好,IE 除外)|维基百科clientserver

优势:

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

安全注意事项

人们经常担心WebSockets的安全性。现实情况是,它几乎没有什么区别,甚至将WebSockets作为更好的选择。首先,使用AJAX,MITM的可能性更高,因为每个请求都是通过互联网基础设施遍历的新TCP连接。使用WebSockets,一旦连接,在两者之间进行拦截就更具挑战性,当数据从客户端流式传输到服务器时,还会额外强制执行帧屏蔽,以及额外的压缩,这需要更多的努力来探测数据。所有现代协议都支持:HTTP和HTTPS(加密)。

附言

请记住,WebSockets通常具有非常不同的网络逻辑方法,更像是实时游戏一直以来,而不是像http。


答案 2

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