6

这个问题和这个问题非常相似: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 可以通过更多方式实现。我对吗?

4

2 回答 2

11

我以前没有听说过这个名字的 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 章末尾,我展示了让所有技术在几乎任何浏览器中工作的代码。优先顺序是:

  • 上交所(如果有)
  • 否则 XHR(如果可用)
  • 如果是 IE8 或 IE9,则为 iframe
  • 否则长轮询

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

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

于 2016-11-14T09:47:07.767 回答
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);
        }
    });
}

于 2018-04-26T21:16:24.057 回答