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 将长轮询套接字打开的主要内容,如果未能解决你的问题,请参考以下文章