2016-11-13 48 views
3

这个问题是这个问题真的很相似:What is the difference between web sockets, long polling, server-sent events and forever frame?Forever-frame和服务器发送的事件有什么区别?

然而,这个问题的答案并没有提到SSE和永远帧之间的差异。
让我给你简单的解释一下。

关于SSE,系统真的很像Comet,但与Comet不同的一点是数据发送后没有断开连接。 因此,从服务器到客户端的连接是长期存在的,客户端接收整个数据的一系列片段。

另一方面,永远的框架似乎与我非常相似。在Forever框架中,首先客户端收到包含iframe标签的页面,在隐藏的iframe内建立一个长期连接。然后客户端接收来自服务器的分块数据,并在客户端已有的第一个文档中使用一些功能来操作DOM。

我假设区别是Forever-frame在机制中使用iframe标记,但SSE不能和SSE可以通过更多方式实现。 我对不对?

回答

2

以前我没有听说过这个名字的Forever-frame! (本书的第7章是关于HTML5 SSE的数据推送应用,位于“iframe”部分)。

长轮询:提出请求(使用XMLHttpRequest的,即阿贾克斯),保持打开状态,直到数据准备在服务器上。然后套接字关闭。重新连接以获取下一个数据位。

XHR轮询:发出请求(使用XMLHttpRequest2,即ajax),但侦听readyState == 3信号。后端服务器必须知道保持连接打开,并且客户端必须知道要听readyState == 3。 (不在IE9和更早,因为该浏览器从来没有提供readyState的== 3级的消息,但去直接的readyState == 4)

的iframe:打开一个隐藏的iframe到后端进程。定期查看iframe的源代码,看看有没有新的东西。 (技术上讲,它适用于所有的浏览器,但IE8和IE9是唯一的,带有足够的低延迟的更新是有用的我(2013年)的测试。)

SSE:的HTML5标准,大致如下XHR轮询(Firefox和Chrome,至少,直接在XMLHttpRequest2之上实现它),但是隐藏了复杂的细节。如果套接字关闭,它还会添加自动重新连接,以及其他一些高级功能。

在上述书的第7章末尾,我展示了让所有技术在任何浏览器中工作的代码。优先顺序为:

  • SSE(如果可用)
  • 其他XHR(如果可用)
  • 其他的iframe,如果IE8或IE9
  • 其他longpoll

还有另一个区别:XHR并且iframe技术将整个消息历史存储在内存中。因此,如果您打算长时间保持套接字打开状态和/或发送大量大消息,这可能会导致内存问题,而SSE不会发生这种情况。

内容提要:不要担心“永远的画面”,除非你有足够的客户仍在使用IE8/IE9的longpoll办法将建立在你的基础设施显着额外的负载。

+0

感谢您对这些技术的概述。但是,在某些方面仍然不明确。 1:我不确定长轮询和XHR轮询之间的区别。我搜索了“XHR轮询”一词,但我找不到任何有关它的好消息。正如您所提到的,不同之处在于,长轮询使用XMLHttpRequest1,其中XML轮询执行XMLHttpRequest2吗? 2:在XHR轮询时,哪一方是从readyState发出的信号?从服务器端?还是客户? 3:你是什么意思的“自动重新连接”?这意味着服务器发送数据后,连接是否中断一次? –

+0

@KazuyaTomita是不是太厚脸皮建议买我的书 - 有足够的空间来覆盖这些主题彻底:-) 正常长轮询和之间有什么区别,我称之为“XHR”被前者只是使用的readyState == 4,而后者使用readyState == 3。 readyState是客户端JavaScript XMLHttpRequest2 API的一部分。 –

+0

因此,您对关于答案的长轮询和XHR轮询的解释的陈述是错误的,因为两者都根据您的其他评论使用XMLHttpRequest2?如果没关系,请给我任何关于question3的简要解释。 –

相关问题