send (WebSocket)

WebSocket メッセージの送信

仕様書

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

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

  1. 第1引数を USVString, Blob, ArrayBuffer, ArrayBufferView のいずれかとして解釈します。
  2. readyState が CONNECTING なら、 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フレームより後に送ってはなりません >>7。 WebSocket接続の状態が OPEN でなければ (なくなれば)、 この手順は停止しなければなりません >>11。

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

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

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

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

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