我在 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 Android或 Google 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/