Questo codice non presuppone errori o frame non validi e si basa su questa risposta - How to (de)construct data frames in WebSockets hybi 08+?.
Questo codice è molto semplice ed è lontano da una soluzione completa. Funziona per i miei scopi (che sono piuttosto semplici). Spero che sia utile per gli altri.
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;
}
Ecco il codice per inviare i dati indietro. Ancora una volta questo è piuttosto semplice, si presuppone che si sta inviando una singola cornice di testo. Nessun frame di continuazione, ecc. Nessun controllo degli errori. Spero che gli altri lo trovino utile.
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;
}
Forse questa domanda è interessante per te: http://stackoverflow.com/questions/7040078/not-sure-how-to-frame-data-in -websockets-draft-08. Ho cercato di spiegare come funziona la nuova inquadratura; forse aiuta. – pimvdb
Questo è stato utile grazie! Pubblicherò la soluzione in PHP per gli altri. – jivetek