WebSocket で使用できるバイナリ データのエンコードの代替手段は何ですか? Base64を使用できることだけを知っています。他にもありますか?
2 に答える
WebSocket をサポートする基本的にすべてのブラウザーが、型付き配列 (arraybuffers) および Blob を介した生のバイナリ データの送受信をサポートするようになったため、テキストとしてのバイナリ データのエンコードはほとんど必要なくなりました。これが必要になるのは、ごくわずかな場合です。
- Internet Explorer 6-9 や firefox 3.6 など、WebSocket サポートが組み込まれていないブラウザーでweb-socket-jsフォールバックを使用する。web-socket-js がバイナリ データをサポートしていない理由は、これらのブラウザが型付き配列と Blob をサポートしていないためです。そのため、「バイナリ」データはすでにブラウザで何らかの方法でエンコードされているためです (多くの場合、0 から 255 までの数値の通常の配列として)。 ) または非 ASCII 文字値の文字列として。
- バージョン 6 未満の Safari (モバイルおよびデスクトップ) など、WebSocket Hixie プロトコル (未加工のバイナリ データを送信する機能がない) のみをサポートするブラウザー。
そのような状況では、base64 が唯一のエンコーディング オプションではありません。有効な UTF-8 テキスト (WebSocket のすべてのバージョンでサポートされるテキスト形式) になるエンコードはすべて機能します。Base64 は、たまたま、atob および btoa 関数を介してブラウザーでサポートするのが非常に簡単です。たとえば、バイナリ バイト値を表す数値の配列がある場合、これを任意の WebSocket バージョンを介して安全に送信できる JSON 文字列にエンコードできます。
JSON.stringify([120,32,255])
'[120,32,255]'
シンプルで人間が読める形式ですが、base64 よりもスペース効率がかなり劣ります。バイナリ データを UTF-8 文字列にエンコードするより効率的な方法もあり、スペース効率が大幅に向上しますが、ブラウザでより多くの CPU リソースを消費することになり、バイナリ データを UTF にマップするためのカスタム アルゴリズムが必要になります。 8 コードポイント。
WebSocket は生のバイナリ データをサポートします。これがどのように公開されるかは、使用している言語/ライブラリ/API によって異なります。JavaScript/ブラウザでは、型指定された配列 (ArrayBuffer または Blob) を使用して send を呼び出すことができます。バイナリ メッセージを受信すると、それらのタイプの 1 つとして配信されます。WebSocket ブラウザー API のドキュメント ( http://www.w3.org/TR/websockets/ ) には、これがどのように行われるかについての詳細が記載されています。