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

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

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

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

既然这两种技术做的是同样的事情,那么在什么样的场景下人们会更喜欢使用其中一种而不是另一种呢?更具体地说,HTML5 WebSockets使AJAX长/短轮询过时了吗,或者有令人信服的理由更喜欢AJAX而不是WebSockets吗?

121304 次浏览

对于聊天应用程序或任何其他与服务器持续对话的应用程序,WebSockets是最佳选择。然而,你只能在支持WebSockets的服务器上使用它们,所以如果你不能安装所需的库,可能会限制你使用它们的能力。在这种情况下,你需要使用Long Polling来获得类似的功能。

WebSockets现在是绝对是未来

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

. long轮询不再是离开

WebRTC允许点对点通信。

我建议学习

比较:

不同的网络交流技巧

  • AJAX - requestresponse。创建到服务器的连接,发送带有可选数据的请求标头,从服务器获取响应,然后关闭连接。 所有主流浏览器均支持

  • 长轮询 - requestwaitresponse。像AJAX一样创建到服务器的连接,但保持一个保持活动的连接打开一段时间(虽然不是很长)。在连接过程中,打开的客户端可以从服务器接收数据。由于超时或数据丢失,客户端必须在连接关闭后定期重新连接。在服务器端,它仍然被视为HTTP请求,与AJAX相同,只是请求的答案将在现在或将来某个时间发生,由应用程序逻辑定义。 支撑图(完整) |

  • - clientserver。创建到服务器的TCP连接,并在需要时保持打开状态。服务器或客户端可以轻松地关闭连接。客户端通过一个HTTP兼容的握手过程。如果成功,那么服务器和客户端可以在任何时候双向交换数据。如果应用程序需要频繁地以两种方式交换数据,那么这种方法是有效的。WebSockets确实有数据帧,包括屏蔽从客户端发送到服务器的每条消息,因此数据是简单加密的。 支撑图(非常好) | wikipedia

  • WebRTC - peerpeer。传输用于在客户端之间建立通信,并且与传输无关,因此它可以使用UDP、TCP甚至更抽象的层。这通常用于大容量数据传输,例如视频/音频流,其中可靠性是次要的,为了响应时间和至少一些数据传输,可以牺牲一些帧或质量进展的减少。双方(对等体)可以独立地向对方推送数据。虽然它可以完全独立于任何集中式服务器使用,但它仍然需要某种方式来交换端点数据,在大多数情况下,开发人员仍然使用集中式服务器来“链接”。同行。只有在交换建立连接的基本数据时才需要这样做,之后就不需要集中式服务器了。 支撑图(中) | wikipedia

  • 服务器发送的事件 - clientserver。客户端与服务器建立持久和长期的连接。只有服务器可以向客户端发送数据。如果客户端想要向服务器发送数据,就需要使用另一种技术/协议来实现。该协议与HTTP兼容,并且在大多数服务器端平台上易于实现。这是一个比长轮询更可取的协议。__abc3 | __abc4

优点:

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

安全注意事项

人们经常关心WebSockets的安全性。现实情况是,它没有什么不同,甚至把WebSockets作为更好的选择。首先,使用AJAX,有一个更高的机会MITM,因为每个请求都是一个新的TCP连接,正在穿越互联网基础设施。使用WebSockets,一旦它被连接起来,在中间拦截就变得更加具有挑战性,当数据从客户端流到服务器时,需要额外的强制帧屏蔽以及额外的压缩,这需要更多的努力来探测数据。所有现代协议都同时支持:HTTP和HTTPS(加密)。

注:

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

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

XHR轮询vs SSE vs WebSockets

  • XHR轮询当事件发生时,请求被回答(可以是立即,也可以是延迟后)。后续的请求将需要接收更多的事件。

    浏览器向服务器发出异步请求, 它可能会等待数据可用后才进行响应。的 响应可以包含编码数据(通常是XML或JSON)或 由客户端执行的Javascript。在处理结束时 的响应,浏览器创建并发送另一个XHR等待 下一个事件。因此浏览器总是保持一个未处理的请求 对于服务器,在每个事件发生时进行应答。维基百科 < / p > 李< /引用> < / >
  • 服务器发送事件客户端向服务器发送请求服务器随时向网页发送新数据。

    传统上,web页面必须向服务器发送请求 接收新数据;也就是说,页面从服务器请求数据。 使用服务器发送的事件,服务器可以发送新数据 可以随时向网页推送消息。这些 传入的消息可以被视为事件+网页内的数据。Mozilla < / p > 李< /引用> < / >
  • 初次握手后(通过HTTP协议)。使用WebSocket协议进行双向通信。

    握手开始于一个HTTP请求/响应,允许服务器 来处理HTTP连接和WebSocket连接 相同的端口。一旦建立了连接,通信就会切换 到一个不符合HTTP协议的双向二进制协议 协议。维基百科 < / p > 李< /引用> < / >