Рукопожатие WebSocket не работает - PullRequest
1 голос
/ 17 ноября 2011

Я делаю простой сервер WebSocket на PHP. Мой клиент веб-сокета нормально подключается к нему, но каждый раз, когда я пытаюсь отправить через него данные, я получаю сообщение об ошибке «Ошибка: INVALID_STATE_ERR: DOM Exception 11» в JavaScript.

Этот и пара других вопросов описывают ту же проблему, что и у меня, но с тех пор протокол WebSocket изменился.

Я предполагаю, что проблема в том, что мой сценарий неправильно рукопожатие, как указано в этом вопросе. Я использую Chromium 15, который использует WebSocket версии 8.

Вот моя функция рукопожатия (частично мой код, частично измененный из устаревшего примера, который я где-то нашел):

function dohandshake($user, $buffer)
{
server_log(1, 'Requesting handshake...');

// Determine which version of the WebSocket protocol the client is using
if(preg_match("/Sec-WebSocket-Version: (.*)\r\n/ ", $buffer, $match))
    $version = $match[1];
else 
    return false;

if($version == 8)
{
    // Extract header variables
    if(preg_match("/GET (.*) HTTP/"   ,$buffer,$match)){ $r=$match[1]; }
    if(preg_match("/Host: (.*)\r\n/"  ,$buffer,$match)){ $h=$match[1]; }
    if(preg_match("/Sec-WebSocket-Origin: (.*)\r\n/",$buffer,$match)){ $o=$match[1]; }
    if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$buffer,$match)){ $k = $match[1]; }

    // Generate our Socket-Accept key based on the IETF specifications
    $accept_key = $k . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
    $accept_key = sha1($accept_key, true);
    $accept_key = base64_encode($accept_key);

    $upgrade =  "HTTP/1.1 101 Switching Protocols\r\n" .
                    "Upgrade: websocket\r\n" .
                    "Connection: Upgrade\r\n" .
                    "Sec-WebSocket-Accept: $accept_key";

    socket_write($user->socket, $upgrade, strlen($upgrade));
    $user->handshake = true;
    return true;
}
else 
{
    server_log("Client is trying to use an unsupported WebSocket protocol ({$version})");
    return false;
}
}

Я протестировал код генерации ключа на нескольких найденных примерах, и, похоже, он вернул правильный ключ в соответствии с этими примерами

1 Ответ

5 голосов
/ 17 ноября 2011

Глупое решение века, по-видимому, две "\ r \ n" новые строки ожидаются в конце ответа на рукопожатие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...