5

lemmingzshadow ( web ) による PHP Websocket サーバーを使用しています。今まではすべてうまくいきました。

Chrome 20 に更新した後、サーバーとハンドシェイクを実行したい場合、このエラーで終了します

Error during WebSocket handshake: Sec-WebSocket-Protocol mismatch 

Chrome 20 のヘッダー

GET /demo HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: gomokulive.eu:8001
Origin: http://www.gomokulive.eu
Sec-WebSocket-Key: s+AMQQu4Q10xH2AKy49byg==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

送り返されたヘッダー:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: dMCVYKkF5VRrIouWFW7EYdvfD28=
Sec-WebSocket-Protocol: demo

Chrome 20 の「Sec-WebSocket-Extensions: x-webkit-deflate-frame」ヘッダーに問題があると思います。

再び機能させる方法はありますか?

4

3 に答える 3

15

サーバーが WebSocket プロトコルに違反しています。Chrome がバージョン 20 でより正確に標準に準拠しているだけで、サーバーのバグが明らかになった可能性があります。

問題は、サーバーが応答で「Sec-WebSocket-Protocol」ヘッダーを送り返すことですが、これはクライアントが要求で同じヘッダーを送信する場合にのみ有効です。クライアントが Sec-WebSocket-Protocol を送信しない場合、サーバーは応答のヘッダーを省略します。

rfc6455 のセクション 4.2.2 の22 ページの /subprotocol/ の説明を参照してください。

于 2012-07-02T21:02:34.563 に答える
3

php-websocketの簡単な修正は次のようになります。

$response.= "Sec-WebSocket-Accept: " . $secAccept . "\r\n";
if (isset($headers['Sec-WebSocket-Protocol']))
{
    $response.= "Sec-WebSocket-Protocol: " . substr($path, 1) . "\r\n";
}
$response .= "\r\n";
于 2012-07-30T00:30:19.760 に答える
1

修正する簡単な方法は、do_handshake 時に情報を追加することですSec-WebSocket-Accept。次のようにコーディングします。

    list($resource,$host,$origin,$key) = $this->getheaders($buffer);

    $accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));

    $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
            "Upgrade: WebSocket\r\n" .
            "Connection: Upgrade\r\n" .
            "WebSocket-Origin: {$origin}\r\n" .
            "WebSocket-Location: ws://{$host}{$resource}\r\n".
            "Sec-WebSocket-Accept: " . $accept . "\r\n\r\n";
    $this->handshakes[$socket_index] = true;

    socket_write($socket,$upgrade,strlen($upgrade));

どこ、

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));

$key はSec-WebSocket-Key$buffer から取得されます。print_r($buffer) で確認できます。

これがあなたの問題を解決できることを願っています..

于 2013-03-06T17:57:31.467 に答える