3

サーバー上のストリーミング エンドポイントへの ajax 呼び出しを使用しようとしています。接続はサーバーからプッシュされたデータを永久に受け入れることができるはずですが、XMLHttpRequest は応答全体をバッファリングしているように見えます。ブラウザー クライアントがデータの各チャンクを 1 回受信して、次のデータに移動するようにしたいだけです。

この動作を防ぐ方法はありますか?

更新: Firefox は、XMLHttpRequest.responseType を「moz-chunked-text」または「moz-chunked-arraybuffer」に設定することで、これをサポートできるようです。ただし、他のブラウザではサポートされていません。とにかく最善のアプローチではない可能性があります。

Firefox の「moz-chunked-arraybuffer」に相当する WebKit xhr responseType

4

2 に答える 2

1

このウィキをチェックしてくださいhttp://en.wikipedia.org/wiki/Push_technology

あなたが考えているのはロングポーリングだと思います。サーバーが出力をチャンクに設定する場所 ( PHP の例については、 PHP にチャンク応答を生成させる方法を参照)

サーバーがチャンクされた応答を送信したら、https://github.com/flowersinthesand/portalのようなものを使用してストリームを継続的に読み取ることができます。

サーバーの転送エンコーディングを変更できない場合、または ajax に固執する必要がある場合の代替手段は、クライアントにサーバーの変更をポーリングさせることです。のようなもの(これを短縮するためにjQueryを使用)

setInterval(function(){
   // last_updated lets you compare what's changed since the last call so you can stream updates. Or you could have the server respond with a certain amount of bytes, and then have this param remember where they are in the stream and send the next X bytes
   $.get("/my/endpoint?last_updated=" + (new Date().getTime()), function(d){
      console.log("Got response");
   });
}, 5000); // Refresh every 5 seconds

個人的には、Socket.ioを使用して多くの幸運がありました。これはnode.js ベースですが、各クライアントが可能な限り最高のパフォーマンスを得る方法を処理します。(内部的には、websockets を使用しようとし、フラッシュ ソケットにフォールバックしてからポーリングするため、すべての人をサポートしながら、新しいブラウザーのファンシーな速度を得ることができます)

于 2013-08-27T18:50:22.980 に答える