12

編集: 私はこの phpwebsocket を試しました: http://www.wilky.it/Shared/phpwebsocket.zipと Firefox で動作しますが、私の質問はまだ残っています: Chrome 17 で websocket を php サーバーで動作させるにはどうすればよいですか?


ここのチュートリアルに従っています: http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

クライアントが接続したように見え、すぐに切断されます。コンソールで次のエラーに気付きました。

WebSocket ハンドシェイク中のエラー: 'Sec-WebSocket-Accept' ヘッダーがありません

php_sockets拡張機能を有効にして、WAMPローカルホストのChrome 17.0.963.56で試しています。

Chrome がサポートするものを変更したという言及をどこかで見ましたが、それを修正する方法について詳しく説明していませんでした。誰かがそれを乗り越えてくれることを望んでいました。(私はウェブソケットが初めてです)。

サーバ:

{パス}>php startDaemon.php

2012-02-20 07:02:51 システム: ソケット リソース ID #7 が作成されました。

2012-02-20 07:02:51 システム: localhost:8000 にバインドされたソケット。

2012-02-20 07:02:51 システム: ソケットでリッスンを開始します。

2012-02-20 07:03:01 WebSocket: リソース ID #8 が接続されました!

2012-02-20 07:03:01 WebSocket: ハンドシェイクをリクエストしています…</p>

2012-02-20 07:03:01 WebSocket: ハンドシェーク…</p>

2012-02-20 07:03:01 WebSocket: ハンドシェイクが完了しました…</p>

2012-02-20 07:03:01 WebSocket: リソース ID #8 が切断されました!

クライアント:

ソケットの状態: 0

ソケットの状態: 3 (クローズ)

4

3 に答える 3

1

私は同じ問題を抱えています(ここにコメントを投稿できないようですので、返信を投稿します)。

実際、phpwebsocket をダウンロードしてテストしました。

Safari 5.1.4 では問題なく動作します。

Chrome 17 では、スクリプト ログ コンソールに同じエラーが表示されました。

Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing

そこで、websocket.class.php で、サーバーから返されたヘッダーに次のように追加しました。

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

そして、私はエラーが発生します:

Error during WebSocket handshake: Sec-WebSocket-Accept mismatch

現在、サーバーが受信するヘッダーは次のとおりです。

GET /websocket/server.php HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:12345
Origin: http://localhost:8888
Sec-WebSocket-Key: OqMJI0t/cOl6d6JNE+Op0g==
Sec-WebSocket-Version: 13

サーバーから返されるヘッダーは次のとおりです。

HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://localhost:8888
Sec-WebSocket-Location: ws://localhost:12345/websocket/server.php
Sec-WebSocket-Accept: ZjY5ODliNTViYzJlOTNkMjk4OTg3Y2U2NjQ3MTBlZjZiNzliYzk4Yg==

Sec-WebSocket-Accept は良さそうですが、それでも不一致エラーが発生します。どこか間違いに気づきませんか?Sec-WebSocket-Accept を計算するようにプロトコルが変更されたのかもしれませんが、見つかりません... 助けてくれてありがとう!

編集:これが解決策のようです(少なくとも私にとっては):この問題のスレッドで指定されたファイルにあるように、パラメーターtrueをSHA1関数に追加します。したがって、Sec-WebSocket-Accept は次のように見つける必要があります。

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

また、Sec-WebSocket-Key1 と Sec-WebSocket-Key2 はクライアント リクエストに存在しないようです。代わりに、ヘッダーから $key を抽出する必要があります: "Sec-WebSocket-Key"。

新しい問題: Web ソケット接続がハンドシェイクで機能するようになった場合でも、最初のメッセージが送信されると切断されるようです。

于 2012-03-17T16:37:33.217 に答える
0

Chrome 19 のコンソールで、サーバーはクライアントに送信するフレームをマスクしてはならないことに気付きました。多分これが問題です。メッセージが送信されるとすぐに切断されます。Firefox では問題なく動作します。

この websocket の問題を修正したところ、Chrome で動作するようになりました。最初に使用した:

次に、 https ://github.com/lemmingzshadow/php-websocket のエンコード機能を使用しました 。

差し替えたエンコード関数を、lemmingzshadow の github の connection.php ファイルにあるものに修正したところ、機能し始めました。この関数は次のように呼び出されます: \server\lib\WebSocket\connection.php ファイル内の hybi10Encode。

関数 encode でこのパラメータを変更します: $masked = true から $masked = false

于 2012-06-30T04:13:07.537 に答える
-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:53:45.153 に答える