Итак, в Chrome 14 реализована версия веб-карт hybi10. У меня есть внутренняя программа, которую наша компания использует через хром, которая использует веб-порты, которые нарушены этим изменением.
Кто-нибудь успешно создал данные с помощью php-сервера? Я могу получить новое рукопожатие для работы, но я не могу понять, каково это. Здесь есть пример python: https://github.com/kanaka/websockify/blob/master/websocket.py#L233, но мне сложно преобразовать это в php, у кого есть предложение?
Следует отметить, что рассматриваемая функция на примере python – decode_hybi ().
Я только что завершил класс, который делает 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)
Этот код не допускает ошибок или искаженных кадров и основывается на этом ответе. Как (де) построить кадры данных в 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; }