3

現在取り組んでいるプロジェクトで Comet の使用を検討しています。
最初に Tomcat6 と CometProcessor API を使用して、次に Jetty7 Continuations を使用してテスト アプリケーションを作成してみました。
アプリケーションは両方で動作していますが、メッセージの実際の表示に問題があります。
私は、XMLHttpRequest 接続を作成し、それを常に開いたままにしておくという手法を使用しました。これにより、サーバーは、接続されているすべてのクライアントに、データが利用可能になるたびにデータを継続的にプッシュできます。

私のクライアント側のコードは次のようなものです:

function fn(){
var xhr = new XMLHttpRequest();
 xhr.onreadystatechange = function(){

  if (xhr.readyState==3){
document.getElementById('dv').innerHTML =(xhr.responseText);
}
if (xhr.readyState==4){
alert ('done');
}
}
xhr.open("GET", "First", true);
xhr.send(null);
}

オンラインのどこかでreadyState 3を使用していることがわかりました。

私は現在2つの問題に直面しています:

  1. Firefox では、このコードは完全に機能します。しかし、新しいタブまたは新しいブラウザー ウィンドウを開いても、サーバーへの新しい接続は作成されず、新しいタブまたはウィンドウには何も表示されず、最初のタブ/ウィンドウのみが表示されます。これを確認するためにwiresharkを使用しましたが、2番目のタブを開いた後でも接続が1つしか表示されません。なぜこれが起こるのか理解できません。2 接続制限について読みましたが、ここでは接続が 1 つしかありません。

  2. 次にChromeでは、上記のコードが機能せず、readystate の 3 に対してコールバックが呼び出されず、サーバーによって接続が閉じられたときにのみ出力が得られます。

また、Comet を Java で実行するための最良の方法/フレームワークはどれかを尋ねたいと思います。現在、クライアント側で jQuery を使用しています。
どんな提案でも大歓迎です!! ありがとう

4

3 に答える 3

0

私もChromeの動作に不満を持っています。

私の解決策は、各応答を送信した後にサーバー上のストリームを閉じ、各応答を受信した後にクライアント側で新しい要求を作成することでした(デイジーチェーン接続)。

ここで私の純粋なTomcatの例を参照してください:http ://sublemon.com/blog/?p=10 。

于 2010-03-01T05:16:59.017 に答える
0

この Chrome の有線動作は本当に厄介です。Chrome で GMail (Google 独自のアプリケーション) がどのように Comet を実装しているかを調べてみましたが、Chrome の HTTP トラフィックを永久にキャッチする適切な Http Sniffer がありません。

解決策1:私の最初の考え:

Comet Http 応答に「Content-Type: multipart/x-mixed-replace」ヘッダーを含めることができます。私はそれをテストしました。応答がマルチパートの場合、( xhr.readyState == 3 ) が true の場合、 xhr.responseTextは空ではありません。

唯一の問題は、xhr.responseTextが、Firefox のように「置換された」応答ではなく、応答全体であることです。たとえば、サーバーは「A」を送信し、次に「B」を送信して「A」を置き換え、次に「C」を送信して「B」を置き換えます。Firefox では、 xhr.readyState==4のときに "A"、"B"、"C" が返されます。Chrome では、 xhr.readyState == 3の場合、「A」、「AB」、および「ABC」を取得します。

したがって、クライアントの JavaScript はxhr.responseTextを解析して、プッシュされたデータを抽出する必要があります。

解決策 2: これは Safari http://lists.macosforge.org/pipermail/webkit-dev/2007-June/002041.htmlで推奨されています。

Webbit エンジンは、表示するのに十分なバイト数になるまで、プッシュされたデータをレンダリングしません。最初に 256 バイトのパディングが必要であると主張されています。Chrome(4.1.249.1036(41514))で試しました。最初にプッシュされたペイロード トリガー (readyState == 3) には、約 1 キロバイトが必要なようです。

XHR が onload イベント ハンドラで直接送信されないようにしてください。それ以外の場合は、ページのタイトルまたは URL バーに読み込みインジケーターがあります。

于 2010-03-20T13:44:32.657 に答える
0

Jetty で comet を使用すると、bayeux と dojo でうまく機能します。サポートは単純な XMLHttpRequest よりも高レベルです。代わりに、別のチャネルへのサブスクリプションと、特定のイベントがチャネルに表示されたときにトリガーされる関数を登録する機能を取得します。1 つのブラウザーで異なるタブに複数の接続を設定するのは非常に簡単で、(私の経験では) Firefox、Chrome、および Safari で動作します。

Java で実行されているサーバーと JavaScript のクライアントがあります。

于 2009-10-15T17:20:15.527 に答える