javascript - 我对 HTTP 轮询、长轮询、HTTP 流和 WebSockets 的理解

标签 javascript web-applications websocket comet http-streaming

我在 SO 和网络上阅读了很多关于问题标题中关键字的帖子,并从中学到了很多东西。我读到的一些问题与具体的实现挑战有关,而另一些则侧重于一般概念。我只是想确保我理解所有的概念以及技术 X 优于技术 Y 等的原因。所以这里是:

Http 轮询:基本上是 AJAX,使用 XmlHttpRequest。

Http Long Polling: AJAX 但服务器会保留响应,除非服务器有更新,一旦服务器有更新,它就会发送它,然后客户端可以发送另一个请求.缺点是需要来回发送额外的 header 数据,从而导致额外的开销。

Http Streaming: 类似于长轮询,但服务器以“Transfer Encoding: chunked” header 响应,因此我们不需要在服务器每次发送一些数据时都发起新请求(从而节省额外的 header 开销)。这里的缺点是我们必须“理解”并弄清楚数据的结构以区分服务器发送的多个 block 。

Java Applet、Flash、Silverlight:它们提供通过 tcp/ip 连接到套接字服务器的能力,但由于它们是插件,开发人员不想依赖它们。

WebSockets:它们是新的 API,它试图通过以下方式解决上述方法的缺点:

  • 与 Java Applets、Flash 或 Silverlight 等插件相比,WebSocket 的唯一优势是 WebSocket 原生内置于浏览器中,不依赖于插件。
  • 与 http 流式传输相比,WebSockets 的唯一优势是您无需努力“理解”和解析接收到的数据。
  • WebSockets 相对于长轮询的唯一优势是消除了额外的 header 大小以及为请求打开和关闭套接字连接。

是否还有其他我遗漏的重要差异?很抱歉,如果我重新询问或将 SO 上已有的许多问题组合成一个问题,但我只想从 SO 和网络上关于这些概念的所有信息中获得完美的理解。

谢谢!

最佳答案

差异比您确定的要多。

双工/定向:

  • 单向:HTTP 轮询、长轮询、流式传输。
  • 双向:WebSockets、插件网络

按延迟增加的顺序(近似值):

  • WebSockets
  • 插件网络
  • HTTP 流媒体
  • HTTP 长轮询
  • HTTP 轮询

CORS(跨源支持):

  • WebSockets:是
  • 插件网络:Flash 通过政策请求(不确定其他)
  • HTTP *(最近的一些支持)

native 二进制数据(类型化数组、blob):

  • WebSockets:是
  • 插件网络:不适用于 Flash(需要跨外部接口(interface)进行 URL 编码)
  • HTTP *:最近提议启用二进制类型支持

降低效率的带宽:

  • 插件网络:Flash 套接字是原始的,除了初始策略请求
  • WebSockets:连接设置握手和每帧几个字节
  • HTTP 流式传输(重新使用服务器连接)
  • HTTP 长轮询:每条消息的连接
  • HTTP 轮询:每条消息的连接 + 无数据消息

移动设备支持:

  • WebSocket:iOS 4.2 及更高版本。一些 Android 通过 Flash 仿真或使用 Firefox for AndroidGoogle Chrome for Android两者都提供 native WebSocket 支持。
  • 插件网络:一些 Android。不在 iOS 上
  • HTTP *:大部分是

Javascript 使用复杂性(从最简单到最复杂)。诚然,复杂性度量有些主观。

  • WebSockets
  • HTTP 投票
  • 插件网络
  • HTTP 长轮询、流式传输

另请注意,有一个名为 Server-Sent Events 的标准化 HTTP 流的 W3C 提案。 .它目前还处于发展的早期阶段,旨在提供标准的 Javascript API,其简单性与 WebSockets 相当。

关于javascript - 我对 HTTP 轮询、长轮询、HTTP 流和 WebSockets 的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12555043/

相关文章:

java - 使用第三方 websocket 插件的 JMETER 2.9 中的未捕获异常 java.lang.ExceptionInInitializerError

javascript - 如果 IE10 或 IE11 显示不同的图像

javascript - 如何检查数组是否包含多个同一个单词

java - 通过 Web 应用程序连接两个调用

web-applications - 通过 JPA Vs 访问数据库表。 Web 应用程序中的 EJB

haskell - 您将如何在 AWS 上托管 Haskell Web 应用程序?

session - 使用 SSL session 缓存对于 websocket 服务器来说是个坏主意吗?

websocket - 德尔福10.4 : Indy TIdTCPClient Reading Data from websocket and webserver

javascript - 在 JavaScript 中编码 HTML 实体

javascript - Bootstrap 轮播 - 如何创建指向特定幻灯片的外部链接