Advertisement
Guest User

WebSocket

a guest
Nov 6th, 2015
501
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.14 KB | None | 0 0
  1. <?php
  2.  
  3. function handshake($connect)
  4. { //Функция рукопожатия
  5.     $info = array();
  6.  
  7.     $line = fgets($connect);
  8.     print_r($line);
  9.    
  10.     $header = explode(' ', $line);
  11.     $info['method'] = $header[0];
  12.     $info['uri'] = $header[1];
  13.     print_r($info);
  14.    
  15.     //считываем заголовки из соединения
  16.     while ($line = rtrim(fgets($connect)))
  17.     {
  18.         if (preg_match('/\A(\S+): (.*)\z/', $line, $matches))
  19.         {
  20.             $info[$matches[1]] = $matches[2];
  21.         } else {
  22.             break;
  23.         }
  24.     }
  25.    
  26.     $address = explode(':', stream_socket_get_name($connect, true)); //получаем адрес клиента
  27.     $info['ip'] = $address[0];
  28.     $info['port'] = $address[1];
  29.    
  30.     if (empty($info['Sec-WebSocket-Key']))
  31.     {
  32.         return false;
  33.     }
  34.     else{
  35.         echo "Sec-WebSocket-Key is ".$info['Sec-WebSocket-Key']."\r\n";
  36.     }
  37.    
  38.     //отправляем заголовок согласно протоколу вебсокета
  39.     $SecWebSocketAccept = base64_encode(pack('H*', sha1($info['Sec-WebSocket-Key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
  40.     $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
  41.         "Upgrade: websocket\r\n" .
  42.         "Connection: Upgrade\r\n" .
  43.         "Sec-WebSocket-Accept:".$SecWebSocketAccept."\r\n\r\n";
  44.     fwrite($connect, $upgrade);
  45.    
  46.     return $info;
  47. }
  48.  
  49. function websock_decode($data)
  50. {
  51.     $bytes = $data;
  52.     $data_length = "";
  53.     $mask = "";
  54.     $coded_data = "" ;
  55.     $decoded_data = "";        
  56.     $data_length = $bytes[1] & 127;
  57.     if ($data_length === 126)
  58.     {
  59.             $mask = substr($bytes, 4, 8);
  60.             $coded_data = substr($bytes, 8);
  61.     }
  62.     else if ($data_length === 127)
  63.     {
  64.             $mask = substr($bytes, 10, 14);
  65.             $coded_data = substr($bytes, 14);
  66.     }
  67.     else
  68.     {
  69.             $mask = substr($bytes, 2, 6);
  70.             $coded_data = substr($bytes, 6);
  71.     }
  72.     for ($i = 0; $i < strlen($coded_data); $i++)
  73.     {
  74.             $decoded_data .= $coded_data[$i] ^ $mask[$i%4];
  75.     }
  76.     //echo "Server Received->".$decoded_data."\r\n";
  77.     return $decoded_data;
  78. }
  79.  
  80. header("Content-Type: text/plain; charset=utf-8");
  81. error_reporting(E_ALL ^ E_WARNING);
  82. set_time_limit(0);
  83. ob_implicit_flush();
  84.  
  85. $NULL = NULL;
  86. $client_socket = array();
  87.  
  88. echo "-= Server =-\n\n";    
  89.  
  90. $address = 'localhost';    
  91. $port    = 10001;    
  92.  
  93. $operators_online = array();
  94.  
  95.  
  96.  
  97.  
  98. $connects = array();
  99.  
  100. $socket = stream_socket_server("tcp://127.0.0.1:10001", $errno, $errstr);
  101. if (!$socket)
  102. {
  103.     echo "socket unavailable<br />";
  104.     die($errstr. "(" .$errno. ")\n");
  105. }
  106.  
  107. while(true)
  108. {
  109.    
  110.     $read = $connects;
  111.     $read []= $socket;
  112.     $write = $except = null;
  113.  
  114.     if (!stream_select($read, $write, $except, null))
  115.     {
  116.         break;
  117.     }
  118.  
  119.     if (in_array($socket, $read))
  120.     {//есть соединение - делаем handshake
  121.         //принимаем новое соединение и производим рукопожатие:
  122.         if (($connect = stream_socket_accept($socket, -1)))
  123.         {
  124.             if ($info = handshake($connect))
  125.             {
  126.                 $connects[] = $connect;//добавляем его в список необходимых для обработки
  127.                 echo "Принято подключение (". count($connects) .")\r\n";
  128.             }
  129.         }
  130.         unset($read[ array_search($socket, $read) ]);
  131.     }
  132.    
  133.     //проверяем на наличие новых соединений
  134.     foreach($connects as $key => $client)
  135.     {
  136.         if(in_array($client, $read))
  137.         {
  138.             //если соединение есть...
  139.         $input = fread($client, 100000);
  140.  
  141.             if($input !== false)
  142.             {
  143.                 //---вот здесь происходит зло!!!-----
  144.         $input = trim($input);
  145.                 echo websock_decode($input);
  146.         //----------------------------------
  147.             }
  148.         }
  149.     }
  150.    
  151.     socket_close($client);
  152.     $read = $connects;
  153.     $read[] = $socket;
  154. }
  155. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement