Заголовок Sec-WebSocket-Accept отсутствует в Chrome 17

Изменить: Я пробовал этот phpwebsocket: http://www.wilky.it/Shared/phpwebsocket.zip, и он работает в Firefox, но мой вопрос все еще остается: как заставить веб-сокеты работать с 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 изменил то, что он поддерживает, но не вдавался в подробности, как это исправить. Я надеялся, что кто-нибудь сможет помочь мне пройти через это. (Я новичок в веб-сокетах).

Сервер:

{ПУТЬ} ›php startDaemon.php

2012-02-20 07:02:51 Система: Создан идентификатор ресурса сокета №7.

2012-02-20 07:02:51 Система: сокет, привязанный к localhost: 8000.

2012-02-20 07:02:51 Система: Начать прослушивание на Socket.

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 (закрыто)


person allicarn    schedule 20.02.2012    source источник
comment
Было бы полезно, если бы вы могли распечатать полученное рукопожатие и весь отправленный ответ. Ошибка указывает на то, что значение Accept отсутствует, но его трудно узнать, не увидев запрос и ответ подтверждения. Я действительно отмечаю, что сервер, который вы связали, отправляет обратно во многие поля в ответе.   -  person kanaka    schedule 22.02.2012
comment
Я использую именно тот код из этой ссылки. Я не совсем уверен, что вы просите?   -  person allicarn    schedule 29.02.2012
comment
Я прошу вас добавить в код инструменты для распечатки запроса подтверждения (из браузера) и ответа (от сервера).   -  person kanaka    schedule 29.02.2012
comment
Думаю, вы используете этот проект: github.com/GeorgeNava/phpwebsocket, на мой взгляд, используйте это разветвленный проект: вместо этого github.com/esromneb/phpwebsocket, это работает хорошо и не пропадает Sec-WebSocket-Accept.   -  person Nabi K.A.Z.    schedule 05.06.2018


Ответы (3)


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

Собственно, я только что скачал и протестировал phpwebsocket.

На сафари 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».

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

person Jo Pango    schedule 17.03.2012

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

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

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

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

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

person PHPGuru    schedule 30.06.2012

ЛЕГКИЙ способ исправить это добавить 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));

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

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

person navins    schedule 06.03.2013