2011-02-01 4 views
0

長いポーリングとオペラに問題があります。私は自分自身をcプログラマにしており、私たちのニーズに合わせてカスタマイズされたhttpデーモンを開発しました。この場合、大量の接続を処理できる長いポーリングサーバーが必要でした。Operaは長いポーリングソケットを開いています

オペラは、サイト上のリンクをクリックしても、長いポーリングを開いたままにしておき、もちろん新しいものを開くことが問題です。私たちはiframeの中にjavascriptを組み込もうとする、基本的なロングポーリング手法を使います。これは他のブラウザでもうまく動作しますが、前回の投票をサーバー側で強制終了しても、オペラはそれらを再オープンします。トラフィック量の多いサイトではオペラを使用しているユーザーのほんの一部で、サイトを閲覧するだけで無料のファイル記述子がすぐに使い尽くされることがあります(サイトをクリックするたびに新しい長い投票が開き、 )。ページのリフレッシュは同じことを引き起こさない、それは正しいことです:長い投票を閉じて、新しい投票を開きます。オペラを閉じた後、すべてのファイル記述子が閉じられ、すべてが正常です。

http-daemonのオペラにいくつかのヘッダーを追加する必要がありますか、JavaScriptの問題がありますか?

編集:バージョン使用してテスト:オペラ/ 9.80(X11; Linuxのx86_64での、U; EN)プレスト/ 2.6.30バージョン/ 10.63

+0

実際のコードをどこかに投稿できますか?正確な例がなければ、分析して解決策を提案するのは難しいです。 – karlcow

+0

Opera 11で動作しますか? – karlcow

答えて

0

私たちは、IFRAME内のJavaScriptを含めるしようとする基本的なロングポーリング技術を使用。

したがって、問題のソケットはiframeにコンテンツを供給していますか?

ページから離れてクリックするとOperaがそれらの接続を終了しているはずです。編集(私はあなたがどこかに転がっIFRAMEへの参照を持っていると仮定します。)

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

:あるいは航行しかし、あなたは、のようなものがページを離れるときiframesを破壊し、明示的に試してみてくださいiframeはどこですか?

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

私はサーバー側でソケットを見ます;)他のサイトに行くリンクをクリックしたり、オペラのタブを閉じても、接続は閉じられません。長い投票接続は、オペラ・プロセスを閉じるときにのみ閉じるように見えます。 –

+0

@Antti:わかっています。私が言っていることは、オペラにあなたがiframeで終わったことを認識させるために何か(もっと多くのことを明示的に)しようとするとどうなりますか?とにかくそれを閉じなければなりませんが、... –

+0

そうです、それはすべきです。私たちはそれを試みます。私のjavascriptの男は、私はこの問題について彼に言ったときに似たようなことを言った:) –

0

まあ、私はそれが "働いている"と思う.. javascriptを変更しないでください。私は、http-daemonのオペラのための特別なルールを作った。それは "403 Forbidden"という古いlong pollに返答する(なぜ私はそれを前に試してみなかったのだろうか?)。それらの古いソケット上の単純なclose()は、接続を再オープンしました。

ブラウザのタブを閉じても、オペラが長い投票を閉じないとばかげているので、私はオペラのプロセス全体を閉じなければなりません。

関連する問題