15

メソッドを介して大規模なBlobまたはArrayBufferJavaScriptを送信している場合...データが送信されるまでメソッド呼び出しはブロックされますか、それともデータのコピーを作成して非同期に送信し、呼び出しがすぐに戻ることができるようにしますか?WebSocketsendsend

関連する (未回答の) 質問は、私の解釈からすると、モバイル Safari で起こっていることを誰かが説明しているように見えるように、一連の急速な送信によって onmessage イベントが遅延するかどうかです

4

1 に答える 1

10

属性の説明に基づいて、すぐに返さなければならないbufferedAmountと推測しました。それ以外の場合は常にゼロになるからです。0 以外の場合、send への以前の呼び出しからバッファリングされたデータが存在する必要があり、send がデータをバッファリングする場合、ブロックする理由はありません。sendbufferedAmount

http://dev.w3.org/html5/websockets/から

bufferedAmount属性は、send()を使用してキューに入れられたアプリケーション データ (UTF-8 テキストおよびバイナリ データ) のバイト数を返す必要がありますが、最後にイベント ループがタスクの実行を開始した時点で、まだ送信されていません。ネットワークに。(したがって、これには、ユーザー エージェントがスクリプトの実行と非同期でテキストを送信できるかどうかに関係なく、現在のタスクの実行中に送信されるテキストが含まれます。) これには、プロトコルによって発生するフレーミング オーバーヘッドや、オペレーティング システムによって行われるバッファリングは含まれません。またはネットワークハードウェア。接続が閉じられている場合、この属性の値はsend()メソッドの呼び出しごとに増加するだけです (接続が閉じられると 、数値はゼロにリセットされません)。

この単純な例では、bufferedAmount属性を使用して、ネットワークがその速度を処理できる場合は 50 ミリ秒ごとに 1 つの更新の速度で、または速すぎる場合はネットワークが処理できる速度で、更新が送信されるようにします。

var socket = new WebSocket('ws://game.example.com:12010/updates');
socket.onopen = function () {
    setInterval(function() {
       if (socket.bufferedAmount == 0)
           socket.send(getUpdateData());
    }, 50);
};

bufferedAmount属性を使用して、ネットワークが処理できるよりも高いレートでデータを送信せずにネットワークを飽和状態にすることもできますが、これには時間の経過とともに属性の値をより注意深く監視する必要があります。

于 2013-08-16T00:28:59.737 に答える