2013-08-15 6 views
6

sendメソッドを使用してメソッドでブロックBlobまたはArrayBufferを送信すると、データが送信されるまでsendメソッド呼び出しブロックが実行されるか、データのコピーが非同期に送信されるすぐに戻ることができますか?JavaScript WebSocket.sendメソッドがブロックされていますか?

関連(未回答)の質問は、誰かがモバイルSafariで起こって説明しているようだとして、送信の急速なシリーズは、onMessageのイベントが延期されることになりますかどうか、私はそれをどう解釈するかで、次のとおりです。Apparent blocking behaviour in JavaScript websocket on mobile Safari

答えて

3

に基づきますbufferedAmount属性の説明は、私はそうbufferedAmountは常にゼロになるのでsendは、すぐに返さなければならないことを推測しています。ゼロ以外の値を指定すると、以前のsend呼び出しでバッファされたデータが存在する必要があります。バッファデータを送信すると、ブロックする理由はありません。 http://dev.w3.org/html5/websockets/

から

bufferedAmount属性はセンドを使用して キューに入ってきた アプリケーションデータのバイト(UTF-8テキストとバイナリデータ)の数()それを返す必要があり、イベントループが開始された最後の時点で、まだタスクが実行されていませんでした。 ( は、ユーザエージェントがスクリプト実行と非同期にテキスト を送信できるかどうかにかかわらず、現在のタスクの実行中に送信されるテキストをすべて含みます)。これは、プロトコルによって発生したフレーム のオーバーヘッド、システムまたはネットワークハードウェア によって実行されます。接続が閉じられている場合、この 属性の値は、send() メソッドの呼び出しごとに増加します(接続が終了すると数値はゼロにリセットされません)。この単純な例では、bufferedAmount属性が ネットワークは、その速度を扱うことができる、または任意の速度でネットワークが ことができれば更新は、すべての50msのいずれかの更新のレートで送信され を確保するために使用される

それが速すぎる場合は、処理してください。

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

これはの値のより注意深い監視が必要であるにもかかわらずbufferedAmount属性も 、ネットワークが処理できるよりも高いレートでデータを送信せずにネットワーク を飽和させるために使用することができます時間の経過に伴う属性

+0

私はこの回答があれば、どれだけの票があるかを見ていきます。論理的には、一般的にブロックする理由はありませんが、バッファリングされた最大量を超えてしまうなど、非常に大きなBlobまたはArrayBufferでどのように動作するかわかりません。この仕様では、sendが呼び出されてバッファが一杯になっている場合、ユーザエージェントがwebsocketをprejudiceで閉じなければならないとしています。 – Triynko

+1

いくつかの実装では2GBの制限があるようです。「ドキュメントでは、現在送受信されている2GBまでのWebソケットメッセージをサポートしています。これは理論上の制限です.mallocはそのようなサイズのモバイルでは失敗しますが、websocketが失敗した場合(仕様が規定するとおり)は失敗します。 " - https://bugzilla.mozilla.org/show_bug.cgi?id=711003 – Triynko

関連する問題