7

Python で記述されたサーバーからクライアント ブラウザー (javascript を実行) にバイナリ データを転送するために、バイナリ モードで websockets を使用しようとしています。この通信はテキスト モードで実装しましたが、代わりにバイナリ モードで通信することでパフォーマンスを向上させたいと考えています。

私が見たすべての例(たとえば、これ、およびTornadoを使用するmatplotlib/webaggのソースコードを掘り下げる場合)は、バイナリモードを使用していると主張していますが、実際には生のバイナリデータをUTF-8にエンコードしているようです(または base64) 送信前のある時点で。私の見解では、これを行うと 30% から 50% のオーバーヘッドが追加されるため、真のバイナリ転送ではありません。

私の質問は、IP ベースの websocket を使用するために、バイナリ データを utf-8 または base64 にエンコードする必要がありますか? そうでない場合は、エンコードせずにこれを行う例を教えてください。

私は常に、ソケットが真のバイナリ通信をサポートしていると信じていましたが、何らかの理由で IP Websocket には当てはまらない可能性があります。おそらく、誰かが問題に光を当てることができます。この分野では過去 1 年かそこらで進歩があったようで、それが混乱を助長しています。

4

1 に答える 1

10

IETF 6455 WebSocket プロトコルは、バイナリ データの直接送受信をサポートしています (古い Hixie プロトコル バリアントはサポートしていませんでした)。独自のフレーミングを実装している場合は、フレーム内のオペコードを 0x2 に設定して、ペイロードが UTF-8 でエンコードされたテキストではなく生のバイナリ データであることを示す必要があります。Python WebSocket ライブラリを使用している場合は、そのライブラリが提供する API を使用してバイナリ モードを選択する必要があります (ライブラリがサポートしている場合)。

: リンク先のは WebSocket の例ではありません (通常の TCP クライアントとサーバーです)。また、その例は、データを UTF-8 または base64 としてエンコードしていません。Websockifyは、(古い Hixie バリアントの base64 エンコーディングに加えて) ダイレクト バイナリ データをサポートする WebSocket サーバーです。免責事項: websockify を作成しました。

于 2013-02-11T15:54:20.627 に答える