Forever-frame和服务器发送事件有什么区别?

时间:2016-11-13 07:31:52

标签: server-sent-events forever-frame

这个问题与这个问题非常相似:What is the difference between web sockets, long polling, server-sent events and forever frame?

但是,这个问题的答案并没有提到SSE和Forever-frame之间的区别。
让我简要解释一下它们。

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

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

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

2 个答案:

答案 0 :(得分:6)

之前我没有听说过这个名字的Forever-frame! (我的书的第7章,HTML5 SSE的数据推送应用程序,在“iframe”部分中介绍)。

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

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(如果有)
  • if iframe if IE8或IE9
  • else longpoll

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

执行摘要:除非您有足够的客户仍在使用IE8 / IE9,否则不要担心“永久框架”,因为longpoll方法会在您的基础架构上产生明显的额外负载。

答案 1 :(得分:0)

由于缺乏浏览器支持,SSE不是一个真正的选择,因此您的问题的答案是....

  

我假设差异是Forever-frame使用的iframe标签   机制,但SSE没有和SSE可以通过更多方式实现

没有

iframe实际上是最容易实现的,并且开销最小。唯一的缺点是随着时间的推移使用内存。

XHR非常干净和高效,但有一些IE版本限制。如果您的用户仍然使用这些版本的IE,他们可能对使用实时消息的应用程序没有任何用处:)

你总是可以使用:

<script>

window.setTimeout(poll, 3000);

function poll() {
    $.ajax({
        url: "/",
        type: "POST",
        data: {},
        dataType: "json",
        traditional: true,
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            // do something                
        },
        error: function () {
            // handle it
        },
        complete: function() {
            window.setTimeout(poll, 3000);
        }
    });
}