Opera将长轮询套接字打开

时间:2011-02-01 15:49:09

标签: javascript sockets opera long-polling file-descriptor

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

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

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

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

2 个答案:

答案 0 :(得分:0)

  

我们使用基本的长轮询技术,试图在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;
};

答案 1 :(得分:0)

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

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