単なるソケット クライアントではなく、実際の Websocket クライアントである理由は何ですか? HTTPリクエストを構築していることがわかります.Websocketと通常のJavaソケットの実際の正式な「定義」は何なのか疑問に思っています。
2 に答える
WebSocketプロトコルは、IETF6455によって定義されています。
koush / android-websocketsプロジェクトは、WebSocketプロトコルのIETF6455バージョンを実装します。
WebSocket接続は、既存のWebインフラストラクチャとより簡単に統合できるHTTP互換のハンドシェイクで始まります。また、安全なクロスオリジン機能も提供します。
接続が確立されると、WebSocket接続は全二重双方向接続になります(たとえば、HTTPロングポールとは異なります)。ただし、この時点でも接続はrawソケットではありません。WebSocketは(基盤となるTCPレイヤーのようにストリーミングするのではなく)メッセージベースであるため、メッセージの境界を示すためにデータのフレーミングが必要でした。各WebSocketフレームには、フレームの長さ、メッセージの最後のフレームか継続か、データがUTF-8か生のバイナリかなどを示す少なくとも2バイトのヘッダーがあります。
さらに、クライアント(ブラウザー)からサーバーへのWebSocketフレームは、Web仲介者(プロキシ、キャッシュなど)の理論上の脆弱性を回避するために、単純な実行XORを使用してマスクされます。
WebSocketはポート80を介してHTTPを処理します。このようなデータは、テキストとバイナリの両方である可能性がありますが、既知のヘッダーもあります。たとえば、HTTPリクエスト302などの予想されるマーカーは簡単に表示されます。一方、「通常の」Javaソケットは次のようになります。
- 名前付きパイプ
- TCP / IP
- UDP
- ブルートゥース
バイナリに関するデータ速度が最大のスループットを持つ、より一般的なソケットメカニズムです。
これは「定義」になりますが、固定されていません。たとえば、HTTP経由で送信する前にBase64でエンコードすることにより、「WebSocket」経由でバイナリを送信できます。
Koushの場合、彼はHTTPリクエストを処理するために標準の周りにラッパー(キーワードはwrapper )を作成しただけです。それは解釈に開かれているので、それは石に設定されていません。Bluetoothのラッパーを簡単に作成して、たとえば「 BTSocket 」と呼んだり、プロセス間通信の場合は「 IPCSocket 」と呼んだりすることができます。Socket
Socket