这个问题与这个问题非常相似: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可以通过更多方式实现。 我是对的吗?
答案 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章末尾,我展示了使用所有技术在任何浏览器中工作的代码。优先顺序是:
另外还有一个区别: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);
}
});
}