Este código asume que no hay errores o marcos mal formados y se basa en esta respuesta - How to (de)construct data frames in WebSockets hybi 08+?.
Este código es muy básico y está lejos de ser una solución completa. Funciona para mis propósitos (que son bastante básicos). Con suerte, es útil para otros.
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;
}
Este es el código para enviar datos de vuelta. De nuevo, esto es bastante básico, supone que está enviando un solo marco de texto. Sin marcos de continuación, etc. No hay errores de verificación tampoco. Espero que otros lo encuentren útil.
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;
}
Quizás esta pregunta le resulte interesante: http://stackoverflow.com/questions/7040078/not-sure-how-to-frame-data-in -websockets-draft-08. Traté de explicar cómo funciona el nuevo encuadre; tal vez ayuda. – pimvdb
Esto fue útil gracias! Publicaré la solución en PHP para otros. – jivetek