send

WebSocket メッセージの送信

仕様書

WebSocket インターフェイス send メソッド

[2] WebSocket インターフェイスsend メソッドは、次のようにしなければなりません >>1

  1. 第1引数を USVString, Blob, ArrayBuffer, ArrayBufferView のいずれかとして解釈します。
  2. readyStateCONNECTING なら、 InvalidStateError 例外を投げ、停止します。
  3. 第1引数が文字列なら、
    1. データを、文字列UTF-8 符号化したものに設定します。
    2. opcode を、テキストフレーム (1) に設定します。
  4. 第1引数が Blob なら、
    1. データを、 Blob が表現する生データに設定します。
    2. opcode を、バイナリーフレーム (2) に設定します。
  5. 第1引数が ArrayBuffer なら、
    1. データを、 ArrayBuffer のバッファーに蓄積されたデータに設定します。
    2. opcode を、バイナリーフレーム (2) に設定します。
  6. 第1引数が ArrayBufferView なら、
    1. データを、参照されている ArrayBuffer のバッファーに蓄積されたデータに設定します。
    2. opcode を、バイナリーフレーム (2) に設定します。
  7. 接続の状態が OPEN なら、
    1. データopcode についてWebSocketメッセージ送信を行います。
    2. 失敗したら (例えばバッファーが満杯なら)、
      1. flagged as full フラグを設定します。
      2. WebSocket接続を閉じる処理を実行します。
  8. bufferedAmount に、データのバイト数を加算します。
[3] bufferedAmount は、送信されない場合でも増えていきます。
[9] flagged as full は、WebSocket接続が閉じられた時に error イベント発火するかの判定に使われます。

処理

[12] WebSocket接続においてWebSocketメッセージ送信 (Send a WebSocket Message) するには、 次のようにしなければなりません >>11

  1. 送信するデータを含む単一のフレームまたは断片化されたフレーム群を作成します (WebSocketフレーム参照)。最初のフレームopcode は、 データの種別により、テキストフレームまたはバイナリーフレームとします。
  2. 送信元がクライアントであれば、マスクします (WebSocketフレーム参照)。
  3. WebSocket拡張を用いる場合は、その規定に従い適宜処理します。
  4. フレーム(群)を転送します。

[13] データフレームCloseフレームより後に送ってはなりません >>7WebSocket接続の状態が OPEN でなければ (なくなれば)、 この手順は停止しなければなりません >>11

[4] 実装時は、バッファーに一時的にフレームを書き込み、 適当な時機に OS (ソケット層) に引き渡すこととなります。 素朴な実装は、WebSocketメッセージ送信時に即座にソケットに送信する (= バッファリングしない) こととなります。より高度な実装は、その時機を調整できます。

[5] アプリケーション内でのバッファリングは、 bufferedAmount 属性によって著者が観測できます。 この属性の値は、 event loop step 1 で更新されます。

[7] アプリケーションバッファーからネットワーク側へと引き渡されるまで、 WebSocket オブジェクトごみ収集されないことになっています。

[6] TCPフロー制御などを含む OS 側でのバッファリングは、 アプリケーションからは検知できません。

[10] Chrome はすべて1つのフレームで送信するようです。 (しかしGB級のデータを送ろうとすると、クラッシュします。)