iframe 中的彗星服务器数据是不是只是累积?

Posted

技术标签:

【中文标题】iframe 中的彗星服务器数据是不是只是累积?【英文标题】:Does comet server data in the iframe just accumulate?iframe 中的彗星服务器数据是否只是累积? 【发布时间】:2011-07-09 22:49:21 【问题描述】:

我使用分块数据将 [script]dosomething()[/script] 标签推送到我的彗星服务器的 iframe 中,但脚本标签只会继续永远累积。如何在每个脚本标签后擦除它?

【问题讨论】:

【参考方案1】:

擦除脚本标签

P.S:当你想擦除脚本标签时,可能要关注Does comet server data in the iframe just accumulate?

我相信你应该close the connection after sometime(不好,请参阅Does comet server data in the iframe just accumulate?)它会自动释放与该请求相关的内存。然后,您当然需要重新连接。 This page 还说了别的:

“页面流”是指浏览器 几乎发现服务器变化 立即地。这打开了 实时更新的可能性 浏览器,并允许 双向信息流。 然而,它与 标准 HTTP 使用,这导致 几个问题。首先,有 不幸的记忆影响, 因为javascript保持 积累,浏览器必须 将所有这些保留在其页面模型中。 在具有大量 更新,该模型将会增长 很快,在某些时候一页 刷新将是必要的,以便 避免硬盘交换,或更糟 命运。

这建议重新加载页面,这也是一个选项。但我认为关闭该连接(iframe)并重新连接也可能有效。

Comet 有很多问题需要解决:

正如您从this WIKI page 中看到的那样,它还存在“可靠的错误处理方法,以及无法跟踪请求调用进程的状态”的问题。 此外,Internet Explorer 需要发送一些垃圾来启动进程(请参阅http://cometdaily.com/2007/11/05/the-forever-frame-technique/)

这就是为什么我再次建议您使用 socket.io(见下文)来处理所有这些废话。

Socket.io

我建议您改用socket.io,这是非常好的产品。它是supported by all major browsers。如您所见,它支持多种传输方式(XHR、Websockets 等)并选择浏览器上可用的最佳传输方式以获得最佳性能。

【讨论】:

当你想擦除脚本标签时,可能要关注***.com/questions/6637987/…【参考方案2】:

擦除脚本标签而不重新连接

您可以通过在服务器打印块时添加一些代码来删除每次执行的脚本标签。

<script type="text/javascript">
// Calls your message handler
app.handle("Hello World");

// Removes this script element
var scripts = document.getElementsByTagName("script"),
    elem = scripts[scripts.length - 1];

elem.parentNode.removeChild(elem);
</script>

压缩版

<script type="text/javascript">
app.handle("Hello World");
(function()var a=document.getElementsByTagName("script"),a=a[a.length-1];a.parentNode.removeChild(a))();
</script>

但是,正如 Alfred 提到的那样,隐藏 iframe 或永久 iframe 太烦人了。就我个人而言,我认为这种经典的方式让彗星看起来既不优雅又没有魅力。

jQuery 流

我的建议是使用jQuery Stream,它提供了统一的基于WebSocket和HTTP协议的双向通信接口。它是一个轻量级的客户端 JavaScript 库,例如 jQuery。

jQuery Stream 使用的增强型 Iframe 传输在许多方面与经典传输不同,它要求仅包含消息的文本/纯文本响应而不是文本/html 响应,并且每次处理时都会清空响应。

根据某位用户test的说法,使用增强型Iframe传输的Internet Explorer 8对于几兆字节的消息是没有问题的(不像Firefox使用XMLHttpRequest作为传输,这真的很吃力)。

【讨论】:

这比重新连接要好得多。但是如果你问我,使用 socket.io 会更好。 非常感谢,jquery 流看起来真的很有帮助

以上是关于iframe 中的彗星服务器数据是不是只是累积?的主要内容,如果未能解决你的问题,请参考以下文章

彗星性能问题

jQuery彗星推送,没有彗星服务器

zai页面中嵌套了一个iframe 框,怎么能够让iframe 中的提示框在整个页面查看,而不是只是在那个框中

BT慧星中的Tracker服务器是啥意思

怎么通过电子游戏藏分?

解决 iframe 后退不是主页面后退(浏览器 history)问题