PHP Websocket Server hybi10 - PullRequest
       6

PHP Websocket Server hybi10

7 голосов
/ 17 августа 2011

Итак, в Chrome 14 реализована версия веб-сокетов hybi10.У меня есть собственная программа, которую использует наша компания через Chrome, в которой используются веб-сокеты, которые не работают с этим изменением.

Кто-нибудь успешно формировал данные с помощью php-сервера?Я в состоянии заставить новое рукопожатие работать, но я не могу понять, что подставило.Здесь приведен пример Python https://github.com/kanaka/websockify/blob/master/websocket.py#L233, но мне трудно преобразовать его в php, у кого-нибудь есть предложение?

Я должен упомянуть, что рассматриваемая функция на примере Python - decode_hybi ().

Ответы [ 2 ]

6 голосов
/ 20 сентября 2011

Я только что закончил класс, который делает PHP-Websocket-сервер от Nico Kaiser (https://github.com/nicokaiser/php-websocket) способным обрабатывать кадры hybi-10 и рукопожатие. Вы можете скачать новый класс здесь: http://lemmingzshadow.net/386/php-websocket-serverclient-nach-draft-hybi-10/(connection.php)

3 голосов
/ 18 августа 2011

Этот код не допускает ошибок или искаженных фреймов и основан на этом ответе - Как (де) построить фреймы данных в WebSockets hybi 08 +? .

Этот код очень прости далеко от полного решения.Это работает для моих целей (которые довольно просты).Надеюсь, он пригодится другим.

function handle_data($data){
    $bytes = $data;
    $data_length = "";
    $mask = "";
    $coded_data = "" ;
    $decoded_data = "";        
    $data_length = $bytes[1] & 127;
    if($data_length === 126){
       $mask = substr($bytes, 4, 8);
       $coded_data = substr($bytes, 8);
    }else if($data_length === 127){
        $mask = substr($bytes, 10, 14);
        $coded_data = substr($bytes, 14);
    }else{
        $mask = substr($bytes, 2, 6);
        $coded_data = substr($bytes, 6);
    }
    for($i=0;$i<strlen($coded_data);$i++){
        $decoded_data .= $coded_data[$i] ^ $mask[$i%4];
    }
    $this->log("Server Received->".$decoded_data);
    return true;
}

Вот код для отправки данных обратно.Опять же, это довольно просто, предполагается, что вы отправляете один текстовый фрейм.Нет кадров продолжения и т. Д. Нет проверки ошибок.Надеюсь, другие найдут это полезным.

public function send($data)
{
    $frame = Array();
    $encoded = "";
    $frame[0] = 0x81;
    $data_length = strlen($data);

    if($data_length <= 125){
        $frame[1] = $data_length;    
    }else{
        $frame[1] = 126;  
        $frame[2] = $data_length >> 8;
        $frame[3] = $data_length & 0xFF; 
    }

    for($i=0;$i<sizeof($frame);$i++){
        $encoded .= chr($frame[$i]);
    }

    $encoded .= $data;
    write_to_socket($this->socket, $encoded);  
    return true;     
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...