Заголовок Sec-WebSocket-Accept отсутствует в Chrome 17 - PullRequest
12 голосов
/ 20 февраля 2012

Изменить: Я попробовал этот phpwebsocket: http://www.wilky.it/Shared/phpwebsocket.zip, и он работает в Firefox, но мой вопрос все еще остается: как мне заставить websockets работать с php-сервером в Chrome 17?


Я следую учебному пособию здесь: http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

Похоже, что клиент подключается, а затем немедленно отключается. Я заметил эту ошибку в консоли:

Ошибка во время рукопожатия WebSocket: отсутствует заголовок «Sec-WebSocket-Accept»

Я пытаюсь сделать это в Chrome 17.0.963.56 на моем локальном хосте WAMP с включенным расширением php_sockets.

Я видел упомянутое где-то, что Chrome изменил то, что он поддерживает, но он не углубился в то, как это исправить. Я надеялся, что кто-нибудь сможет пройти через это. (Я новичок в веб-розетках).

Сервер:

{PATH}> php startDaemon.php

2012-02-20 07:02:51 Система: Socket Resource id # 7 создан.

2012-02-20 07:02:51 Система: Сокет привязан к локальному хосту: 8000.

2012-02-20 07:02:51 Система: Запустите прослушивание на сокете.

2012-02-20 07:03:01 WebSocket: ИД ресурса № 8 ПОДКЛЮЧЕН!

2012-02-20 07:03:01 WebSocket: запрос рукопожатия…

2012-02-20 07:03:01 WebSocket: рукопожатие…

2012-02-20 07:03:01 WebSocket: Готово, рукопожатие ...

2012-02-20 07:03:01 WebSocket: идентификатор ресурса № 8 отключен!

Клиент:

Состояние гнезда: 0

Состояние сокета: 3 (закрыто)

Ответы [ 3 ]

1 голос
/ 17 марта 2012

У меня та же проблема (и я не могу разместить комментарий здесь, поэтому я отправляю ответ).

На самом деле, я только что скачал и протестировал 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».

Новая проблема : Кажется также, что даже если соединение через веб-сокет теперь работает на рукопожатии, оно отключаетсякогда отправлено первое сообщение.

0 голосов
/ 06 марта 2013

ПРОСТОЙ способ исправить это добавить Sec-WebSocket-Accept информацию, когда do_handshake, код как показано ниже:

    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));

ключ $ Sec-WebSocket-Key получен из $ buffer, вы можете посмотреть print_r ($ buffer).

Надеюсь, что это может решить вашу проблему ..

0 голосов
/ 30 июня 2012

Я заметил, что в консоли Chrome 19: Сервер не должен маскировать кадры, которые он отправляет клиенту. Может быть, это проблема. Он отключается, как только сообщение отправлено. В Firefox работает нормально.

Я исправил эту проблему с веб-сокетом, и теперь она работает в Chrome. Сначала я использовал:

Тогда я использовал функцию кодирования из: https://github.com/lemmingzshadow/php-websocket

Я исправил замененную функцию кодирования с функцией в файле connection.php в github lemmingzshadow, и она начала работать. Функция называется: hybi10Encode в файле \ server \ lib \ WebSocket \ connection.php.

изменить этот параметр в функции encode: $ masked = true на $ masked = false

...