Opera 将长轮询套接字打开

Posted

技术标签:

【中文标题】Opera 将长轮询套接字打开【英文标题】:Opera leaves long polling socket(s) open 【发布时间】:2011-02-01 15:49:09 【问题描述】:

我们遇到了长轮询和歌剧的问题。我自己是一名 c 程序员,并且已经为我们的需要开发了一个定制的 http-daemon。在这种情况下,我们需要一个能够处理大量连接的长轮询服务器。

问题在于,即使在单击站点上的某些链接并且当然会打开新的链接之后,Opera 也会以某种方式使这些长民意调查保持打开状态。我们使用基本的长轮询技术,它试图在 iframe 中包含 javascript。这适用于其他浏览器,但即使我强制以前的民意调查在服务器端关闭,opera 也会重新打开它们。这不是很好,因为在高流量站点上,只有少数 opera 用户可以通过浏览站点导致守护程序快速耗尽免费文件描述符(因为站点上的每次点击都会打开一个新的长轮询,而旧的不会关闭)。页面刷新不会导致相同的结果,它会做正确的事情:关闭长轮询并打开一个新的。关闭opera后,所有文件描述符都关闭了,一切又好了。

那么,我应该在 http-daemon 中为opera 添加一些特定的标头还是我们的javascript 有问题?

编辑:使用版本测试:Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.6.30 Version/10.63

【问题讨论】:

你能在某处发布一段实际的代码吗?没有准确的例子,很难分析和提出解决方案。 【参考方案1】:

我们使用基本的长轮询技术,尝试在 iframe 中包含 javascript。

所以有问题的套接字正在向iframe 提供内容?

如果您点击离开页面,Opera 似乎应该关闭这些连接。但是您可以尝试在离开页面时显式销毁iframes,例如:

window.onbeforeunload = function() 
    theIframe.parentNode.removeChild(theIframe);
    theIframe = undefined;
;

(我假设您在某处引用了 iframe。)

编辑:甚至先将 iframe 导航到别处:

window.onbeforeunload = function() 
    theIframe.src = "about:blank";             // <== New bit
    theIframe.parentNode.removeChild(theIframe);
    theIframe = undefined;
;

【讨论】:

我在服务器端查看套接字;) 即使您单击指向其他站点的链接或关闭歌剧上的选项卡,连接也不会关闭。长轮询连接似乎只有在您关闭 Opera 进程时才会关闭。 @Antti:我明白了。我要说的是,如果你尝试做一些(甚至更)明确的事情来让 Opera 认识到你已经完成了那个 iframe,会发生什么?无论如何,它确实应该关闭它们,但是... 是的,应该。我们将尝试这种方法。当我告诉他这个问题时,我们的 javascript 人说了类似的话 :)【参考方案2】:

好吧,我认为我们让它“工作”了.. 没有修改 javascript。我在 http-daemon 中为歌剧制定了特定规则,它以“403 Forbidden”回复旧的长民意调查(为什么我之前没有尝试过这个问题:P)。那些旧套接字上的简单 close() 只是让 opera 重新打开连接。

即使我关闭浏览器上的标签,opera也不会关闭那些长民意调查,这很荒谬,我必须关闭整个opera进程。

【讨论】:

以上是关于Opera 将长轮询套接字打开的主要内容,如果未能解决你的问题,请参考以下文章

[当套接字可用时使用HTTP长轮询(例如iPhone,Blackberry)

Rails 3:支持 IE 9 的长轮询或套接字

长轮询如何工作 javascript?

Tornado-长轮询_webSocket

轮询与长轮询[关闭]

长轮询和服务器行为