ошибка не является допустимым ресурсом Socket, реализующим библиотеку phpwebsocket

Я пытаюсь работать с библиотекой phpwebsocket по адресу http://code.google.com/p/phpwebsocket/ Я использую версию r8 файла server.php. Для тестирования я только что попробовал файл client.html, также предоставленный веб-сайтом.

При запуске сервера получаю следующее:

Server Started : 2011-08-29 22:11:23
Master socket  : Resource id #4
Listening on   : www.midomain.com port 12345

Но когда я загружаю файл client.html в браузер, сервер показывает следующие ошибки:

Notice: Undefined variable: key1 in /home/mink500/public_html/test/server.php on line 143
Notice: Undefined variable: key2 in /home/mink500/public_html/test/server.php on line 143
Warning: socket_select(): 5 is not a valid Socket resource in /home/mink500/public_html/test/server.php on line 15

Есть две переменные, которые не определены, и функция socket_select() возвращает ошибку «5 не является допустимым ресурсом сокета».

В браузере я получаю сообщение «Отключено», как только файл загружается.

Я попытался заставить сервер работать локально, используя XAMPP (Apache и PHP), но получил те же ошибки. Я также пытался изменить порты и следовать инструкциям в этом выпуске:

http://code.google.com/p/phpwebsocket/issues/detail?id=33

Но я все еще получаю сообщение об ошибке «5 не является допустимым ресурсом сокета».

Помню, обновляя страницу несколько раз у меня заработало несколько месяцев назад, а сейчас это невозможно. Кроме того, мне нужно, чтобы он работал постоянно, а не только после того, как я обновлю страницу примерно 20 раз.

Я также пытался использовать файл websocket.class.php, но на этот раз я получаю сообщение об ошибке на стороне клиента. Браузер теперь возвращает «Ошибка во время рукопожатия WebSocket: заголовок« Sec-WebSocket-Accept »отсутствует».

Итак, я не могу заставить его работать со старыми или новыми файлами, с удаленным или локальным сервером, с магией или доской для спиритических сеансов!

Есть идеи?

Спасибо


person Mikiko Jane    schedule 30.08.2011    source источник


Ответы (1)


Начиная с новейших файлов phpwebsocket client.html и server.php, я заменил функции getheaders() и dohandshake() приведенным ниже кодом, который работает для меня в новейшем Chrome. Однако в настоящее время он не пишет в браузер и не остается в живых после одного комментария пользователя в окне чата.

function dohandshake($user, $buffer) {
$key = null;

console("\nRequesting handshake...");
console($buffer);
console("Handshaking...");

preg_match("#Sec-WebSocket-Key: (.*?)\r\n#", $buffer, $match) && $key = $match[1];

$key .= "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
$key = sha1($key);
$key = pack('H*', $key);
$key = base64_encode($key);

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

socket_write($user->socket, $upgrade . chr(0), strlen($upgrade . chr(0)));
$user->handshake = true;
console($upgrade);
console("Done handshaking...");
return true;
}

function getheaders($header) {
$retVal = array();
$fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header));
foreach ($fields as $field) {
    if (preg_match('/([^:]+): (.+)/m', $field, $match)) {
        $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
        if (isset($retVal[$match[1]])) {
            $retVal[$match[1]] = array($retVal[$match[1]], $match[2]);
        } else {
            $retVal[$match[1]] = trim($match[2]);
        }
    }
}

if (preg_match("/GET (.*) HTTP/", $header, $match)) {
    $retVal['GET'] = $match[1];
}
return $retVal;
}
person Brian    schedule 06.11.2011