私は単純なWebSocketサーバーをPythonで書いています。これはポートで待機し、ハンドシェイクを実行してから番号を含む一連のメッセージ(ランダムな間隔で配置されています)をクライアントに送信します。クライアントが使用するwebsocketのバージョンを知るには?
私はjavascriptクライアントを作成し、ChromeとSafariでテストしました。私は、ChromeとSafariが異なるWebSocketバージョンを使用していることを発見しました。たとえば、ChromeはSec-WebSocket-Key(Sec-WebSocket-Accept)を使用し、SafariはSec-WebSocket-Key1、Sec-WebSocket-Key2、およびヘッダーの後に8バイトの束を送信します。
私はサーバーに、必要なハンドシェイクの種類を検出して実行するハンドシェイク機能を実装しました。この問題は解決されました。 websocketは、ChromeまたはSafari(OSX、Windows、IOS5の両方)から正しく開きます。
しかし、別の問題があります。明らかにSafariは0x00と0xFFで区切られたメッセージを送信し、期待していますが、Chromeはフレーム同期およびマスクされたデータを送信し、期待しています(WebSocket仕様のより新しいバージョンを使用)。
私は、クライアントの期待にそれ自身を適応させる単一のサーバーを使いたいと思っています。私の質問は、データがフレーム化されているか0x00,0xFFで区切られているかどうかを事前にどのように伝えることができますか?
私は、ハンドシェイクプロトコルがKey1とKey2をベースにしている場合、クライアントはSafariで、0x00 0xFFを使用してデータを区切ります.Sec-WebSocket-Keyを使用するクライアントはChromeですが、フレーム化されたデータを使用します。しかし、一般的ではないので、私はこの解決策に満足していません。アイデア?
リンクありがとうございます。私が正しく理解していれば、「WebSocket-Version」やそれに類するヘッダはなく、使用しているバージョンを手動で検出するためのアドホックコードを書くべきでしょうか? – JLDiaz
それは正しいです。 (RFCの後半にバージョンヘッダがありますが、ChromeとSafariの両方で適切なヘッダーはありません)。私はSec-WebSocket-Key1ヘッダーを使ってhixie-76(Safari)を推論するシンプルなwebsocketサーバーを持っています。 RFC 6455(Chrome)を推測するSec-WebSocket-Keyヘッダー – simonc
これは正しくありません。何か> = Hybi.10の場合、ヘッダーはChrome、Firefox、WebKit Nightly、IE10 .. Sec-WebSocket-Versionによって送信されます。彼らは8または13を送信します。このヘッダーは古いHixie-76には存在しませんが、廃止予定のバージョンに残っている唯一のものはSafariです。 Webkit NightlyはRFC6455を持っています。 見てください:http://autobahn.ws/testsuite/reports/clients/index.html ブラウザごとにケース1.1.1をクリックし、WebSocketハンドシェイクまでスクロールダウンします。 免責事項:私はAutobahnの著者であり、Tavendoの仕事をしています。 – oberstet