├── README.md ├── example.php └── socket.io.php /README.md: -------------------------------------------------------------------------------- 1 | PHP_SocketIO_Client 2 | =================== 3 | 4 | EN: PHP client for socket.io (websocket client) 5 | 6 | How to use: 7 | ``` 8 | $socketio = new SocketIO(); 9 | if ($socketio->send('localhost', 9090, 'message', 'Hello world!')){ 10 | echo 'we sent the message and disconnected'; 11 | } else { 12 | echo 'Sorry, we have a mistake :\'('; 13 | } 14 | ``` 15 | 16 | 17 | 18 | RUS: PHP клиент для socket.io 19 | 20 | Как использовать: 21 | ``` 22 | $socketio = new SocketIO(); 23 | if ($socketio->send('localhost', 9090, 'message', 'Привет мир!')){ 24 | echo 'Мы отправили сообщение и отключились от сокета'; 25 | } else { 26 | echo 'Возникла ошибка при общении с веб-сокетом :\'('; 27 | } 28 | ``` 29 | 30 | 31 | Thanks to: 32 | ===================== 33 | bitkill 34 | -------------------------------------------------------------------------------- /example.php: -------------------------------------------------------------------------------- 1 | send('localhost', 9090, 'Hello world!')){ 8 | echo 'we sent the message and disconnected'; 9 | } else { 10 | echo 'Sorry, we have a mistake :\'('; 11 | } 12 | 13 | 14 | 15 | ?> -------------------------------------------------------------------------------- /socket.io.php: -------------------------------------------------------------------------------- 1 | generateKey(); 27 | $out = "GET $address&transport=$transport HTTP/1.1\r\n"; 28 | $out.= "Host: http://$host:$port\r\n"; 29 | $out.= "Upgrade: WebSocket\r\n"; 30 | $out.= "Connection: Upgrade\r\n"; 31 | $out.= "Sec-WebSocket-Key: $key\r\n"; 32 | $out.= "Sec-WebSocket-Version: 13\r\n"; 33 | $out.= "Origin: *\r\n\r\n"; 34 | 35 | fwrite($fd, $out); 36 | // 101 switching protocols, see if echoes key 37 | $result= fread($fd,10000); 38 | 39 | preg_match('#Sec-WebSocket-Accept:\s(.*)$#mU', $result, $matches); 40 | $keyAccept = trim($matches[1]); 41 | $expectedResonse = base64_encode(pack('H*', sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))); 42 | $handshaked = ($keyAccept === $expectedResonse) ? true : false; 43 | if ($handshaked){ 44 | fwrite($fd, $this->hybi10Encode('42["' . $action . '", "' . addslashes($data) . '"]')); 45 | fread($fd,1000000); 46 | return true; 47 | } else {return false;} 48 | } 49 | private function generateKey($length = 16) 50 | { 51 | $c = 0; 52 | $tmp = ''; 53 | while ($c++ * 16 < $length) { $tmp .= md5(mt_rand(), true); } 54 | return base64_encode(substr($tmp, 0, $length)); 55 | } 56 | private function hybi10Encode($payload, $type = 'text', $masked = true) 57 | { 58 | $frameHead = array(); 59 | $payloadLength = strlen($payload); 60 | switch ($type) { 61 | case 'text': 62 | $frameHead[0] = 129; 63 | break; 64 | case 'close': 65 | $frameHead[0] = 136; 66 | break; 67 | case 'ping': 68 | $frameHead[0] = 137; 69 | break; 70 | case 'pong': 71 | $frameHead[0] = 138; 72 | break; 73 | } 74 | if ($payloadLength > 65535) { 75 | $payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8); 76 | $frameHead[1] = ($masked === true) ? 255 : 127; 77 | for ($i = 0; $i < 8; $i++) { 78 | $frameHead[$i + 2] = bindec($payloadLengthBin[$i]); 79 | } 80 | if ($frameHead[2] > 127) { 81 | $this->close(1004); 82 | return false; 83 | } 84 | } elseif ($payloadLength > 125) { 85 | $payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8); 86 | $frameHead[1] = ($masked === true) ? 254 : 126; 87 | $frameHead[2] = bindec($payloadLengthBin[0]); 88 | $frameHead[3] = bindec($payloadLengthBin[1]); 89 | } else { 90 | $frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength; 91 | } 92 | foreach (array_keys($frameHead) as $i) { 93 | $frameHead[$i] = chr($frameHead[$i]); 94 | } 95 | if ($masked === true) { 96 | $mask = array(); 97 | for ($i = 0; $i < 4; $i++) { 98 | $mask[$i] = chr(rand(0, 255)); 99 | } 100 | $frameHead = array_merge($frameHead, $mask); 101 | } 102 | $frame = implode('', $frameHead); 103 | for ($i = 0; $i < $payloadLength; $i++) { 104 | $frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i]; 105 | } 106 | return $frame; 107 | } 108 | } 109 | --------------------------------------------------------------------------------