7

コメットプログラミングのフレームワークを開発するつもりですが、Web Socketsやサーバー送信イベントを使用できません(ブラウザーのサポートが非常に悪いため)。したがって、HTTP接続を維持し、チャンク化されたデータをクライアントに送り返す必要があります。

ただし、作業に入ると問題が発生します。

  1. xhr.responseTextが3である間はIEが提供しないため、XMLHttpRequestを使用することはできませんxhr.readyState
  2. iframeクライアントにデータを送り返す間、ブラウザにローダーが表示されるため、hiddenは役に立ちません。
  3. JavaScriptファイルをクライアントに送り返して、毎回関数実行コマンドを送信しようとしましたが、ブラウザは完全に読み込まれるまでJavaScriptを実行しません。

ただし、Lightstreamerのデモページを見ると、JavaScriptファイルがクライアントに少しずつ返され、各ステップで関数の呼び出しが送信され、その関数が実行されるだけであることがわかります(これはできません)部)。リクエストはFirebugのコンソールタブに表示されるだけなので、LightstreamerはAJAXを使用しているようですが、IEでも魅力のように機能します。

リクエストに応じて設定したすべてのHTTPヘッダーフィールドを使用しようとしましたが、結果はありませんでした。HTTPGetの代わりにHTTPPostを使用しようとしましたが、それでも結果が得られませんでした。

コメットの実装方法に関する20以上の記事を読みましたが、どの問題も解決していないようです。

  1. クロスブラウザにする方法は?
  2. サーバーから新しいデータが到着したときに通知を受け取る方法(どのイベントにフックする必要がありますか)?
  3. ページをユーザーに完全に読み込まれたように見せるための方法(ブラウザに読み込みアクティビティが表示されないように実装する方法)?

誰か助けてもらえますか?すべての概念を結び付けるために、ここではわからないヒントやコツはほとんどないはずだと思います。これらの問題を克服するためにライトストリーマーが何をするか知っている人はいますか?

4

4 に答える 4

5

SockJS の作成者はこちら。

  • クロスブラウザにする方法は?

これは大変です。Opera と IE でストリーミング トランスポートを取得するには、数か月かかると予想されます。

  • サーバーから新しいデータが到着したときに通知を受け取る方法 (どのイベントにフックする必要がありますか)?

特定のブラウザに応じて、さまざまな手法があります。はじめに、Socket.IO と SockJS でサポートされているさまざまなフォールバック プロトコルをご覧ください。

  • ページが完全にロードされたようにユーザーに表示する方法 (ブラウザがロード アクティビティを表示しないように実装する方法)?

ここでも、ブラウザ固有のトリックがあります。1 つは、onload イベントの後に AJAX の読み込みを遅らせることです。もう 1 つは、iframe を DOM からバインドおよびバインド解除することです。等。それでも興味がある場合は、SockJS または Socket.io のコードを読んでください。

誰でも助けてもらえますか?ここでは、すべての概念を結び付けるために、私が知らない小さなヒントやトリックが必要だと思います。これらの問題を克服するためにライトストリーマーが何をするか知っている人はいますか?

基本的に、非常に強い理由がない限り、車輪を再発明しないでください。SockJS、Socket.io、faye、またはこの問題を既に解決している他の数十のプロジェクトを使用してください。

于 2012-05-08T12:17:56.393 に答える
4

必要なメソッドはストリーミングです。

クロスブラウザにする方法は?

ほとんどのブラウザーを考慮すると、一貫した方法はありません。ブラウザに応じて適切なトランスポートを選択する必要があります。さらに悪いことに、どのブラウザーが使用されているかを認識するためにブラウザー スニッフィングに頼らなければならず、これに関しては機能の検出は何の意味もありません。IE8+ には XDomainRequest、非 IE には XMLHttpRequest、IE 6+ には Iframe を使用できます。可能であれば、iframe トランスポートを避けてください。

サーバーから新しいデータが到着したときに通知を受け取る方法 (どのイベントにフックする必要がありますか)?

これは、使用するトランスポートによって異なります。たとえば、Opera と IE 以外ではチャンクが到着したときに、XDomainRequest は progress イベントを発生させ、XMLHttpRequest は readystatechange イベントを発生させます。

ページが完全にロードされているようにユーザーに見せる方法 (ブラウザがロード アクティビティを表示しないように実装する方法)?

iframe でのこの問題はわかりませんが、XMLHttpRequest を使用する Chrome や Safari などの WebKit ベースのブラウザーでは依然として発生します。これを回避するには、window の onload イベント後に接続するしかありませんが、Safari の場合、これは機能しません。

上記の質問以外にも、考慮しなければならない問題がいくつかあります。

  1. イベント駆動型サーバー - サーバーは非同期に処理できる必要があります。
  2. トランスポート要件 - サーバーは、必要なトランスポートに対して異なる動作をします。
  3. ストリーム形式 - サーバーが大きなメッセージまたは複数のメッセージを 1 つのチャンクで送信する場合、1 つのチャンクは 1 つのデータを意味しません。単一のデータのフラグメントまたは複数のデータの連結である可能性があります。データとは何かを認識するために、応答をフォーマットする必要があります。
  4. エラー処理 - Iframe トランスポートは切断の証拠を提供しません。
  5. ...

最後になりましたが、ストリーミングの実装は、長いポーリングとは異なり、見た目よりもかなり面倒です。私が作成して管理したsocketiosockjsjquery socketなどの強固なフレームワークを使用することをお勧めします。

幸運を。

于 2012-05-07T11:51:15.400 に答える
3

ただし、ブラウザは、完全に読み込まれるまでJavaScriptを実行しません。

<script>タグでラップされたコードを返送してみましたか?たとえば、次の代わりに:

<script type="text/javascript">
f(...data1...);
f(...data2...);

試す

<script type="text/javascript">f(...data1...);</script>
<script type="text/javascript">f(...data2...);</script>
于 2012-05-06T04:44:53.763 に答える
1

あなたの場合の最良の選択肢は、サーバー側で JSONP + ロングプルを使用することです。接続が切断 (タイムアウト) したり、応答を受け取ったりした場合は、必ず再接続することを忘れないでください。

jquery のコード例:

function myJSONP(){
    $.getScript(url, {
        success: function(){
            myJSONP(); //re-connect
        }, 
        failure: function(){
            myJSONP(); //re-connect
        }
    })
} 

明らかに、サーバーからの応答は、グローバル関数を呼び出す JavaScript コードでなければなりません。

または、jquery JSONP プラグインを使用することもできます。

または、このプロジェクトを見てみましょうhttp://www.meteor.com/ (本当にクールですが、試していません)

于 2012-05-06T04:54:58.030 に答える