6

Firefox と Chrome 18 で完全に動作する Websocket クライアント/サーバーがあります。Chrome 19 ベータ版では動作しません。サーバーがサポートしていない deflate-frame 拡張機能を使用しているこのブラウザーが原因であると思われます。

Chrome 19 ベータ版はハンドシェイクでこれを送信しています: "Sec-WebSocket-Extensions: x-webkit-deflate-frame"

サーバーが「Sec-WebSocket-Extensions:」を返信しています。

しかし、これは拡張機能を拒否する適切な方法ではないか、私がキャッチしていない何か他の問題があります。これは、動作中のブラウザーから来るものとは異なるハンドシェイクの唯一のものです。

編集:ここにいくつかの追加情報があります。これらは、Wireshark によってキャプチャされたハンドシェイクです。


Firefox 12 を使用したハンドシェイク:

GET /chatserver HTTP/1.1
Host: (この投稿では省略)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml, application/xml;q=0.9, / ;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive, Upgrade
Sec-WebSocket-Version: 13
Origin: (この投稿では省略)
Sec-WebSocket-Key: 2TKm4ozUQdNP17Lobt7IBg==
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

HTTP/1.1 101 スイッチング プロトコル
アップグレード: websocket
接続:
Sec-WebSocket-Accept のアップグレード: pSUB3BT9YUUd9n3mOeWY/1uVqJE=


Chrome 18 を使用したハンドシェイク:

GET /chatserver HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: (この投稿では
省略) Origin: (この投稿では省略)
Sec-WebSocket-Key: zuHLEC8pGvAMadarhCLXFA==
Sec-WebSocket-Version: 13

HTTP/1.1 101 スイッチング プロトコル
アップグレード: websocket
接続:
Sec-WebSocket-Accept のアップグレード: LMBSq6Bk9Kiv+zAbQlAL899pfzc=


Chrome 19 を使用したハンドシェイク:

GET /chatserver HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: (この投稿では
省略) Origin: (この投稿では省略)
Sec-WebSocket-Key: TbwnVcuUiqGgZn7hxvxzvQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

HTTP/1.1 101 スイッチング プロトコル
アップグレード: websocket
接続: アップグレード
Sec-WebSocket-Accept: D45BJ+Vfydy1Upcs3HZe/nuiaS8=
Sec-WebSocket-Extensions:


すべてのサーバー応答には \r\n 行末があり、メッセージの最後に余分な \r\n が含まれます。

FF12 と Chrome18は動作しますが、 Chrome19 は動作しません。Chrome19 では、サーバー ハンドシェイク応答の直後のパケットは FIN/ACK です。接続が閉じられています。

注意してください。Sec-WebSocket-Extensions 値としてハイフンを使用してみましたが、どちらも機能しませんでした。

4

2 に答える 2

4

問題が見つかりました。

まず、サーバー応答の空白の Sec-WebSocket-Extensions エントリが " Invalid UTF-8 sequence in header value" エラーを生成していました。そのエントリを削除した後、残ったエラーは " A server must not mask any frames that it sends to the client."でした

実際、私のサーバー実装 (PHPWebSocket の高度に変更されたバージョン) は、送信するフレームをデフォルトでマスキングします。このデフォルトの動作を変更すると問題が修正され、websocket 接続が Chrome 19 で機能するようになりました。

そのプロジェクトの問題であるため、この質問に PHPWebSocket タグを追加します。

于 2012-05-06T06:07:45.763 に答える
2

Chrome の場合、「Sec-WebSocket-Protocol」ヘッダーには、サーバー側とクライアント側の両方の値が必要です。これは私の場合です。

于 2013-11-19T11:15:20.657 に答える