Advertisement
Guest User

Untitled

a guest
Jul 12th, 2012
1,419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.35 KB | None | 0 0
  1. <?
  2.   header('Content-Type: text/plain;'); // хэйдер возвращение данных
  3.   set_time_limit(0); // заставляет работать php-скрипт как демон
  4.   ob_implicit_flush(true); // отправляет информацию вне зависимости от того, закончил ли работать php-скрипт или нет
  5.   $sockets = array(); // все сокеты
  6.   $handshakes = array(); // массив рукопожатий (отдаём информацию о том, что это не просто сокет, а сокет по стандарту WebSocket
  7.  
  8.   $sockets["server"] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);  // создаём главный сокет-сервер, к которому будут обращаться клиенты
  9.   socket_bind($sockets["server"], "localhost", 10001); // прикрепляем главный сокет-сервер к адресу ws://localhost:10001/%server%.php
  10.   socket_set_option($sockets["server"],SOL_SOCKET,SO_REUSEADDR,1); // разрешаем использовать один порт для нескольких соединений
  11.   socket_listen($sockets["server"], 20); // ставим лимит подключений (20)
  12.  
  13.   while (true) { // скрипт работает постоянно
  14.     $changed_sockets = $sockets;
  15.     $num_sockets = socket_select($changed_sockets, $write=NULL,$exceptions=NULL,NULL); // проверим все сокеты на изменение статуса по сравнению с прошлым разом
  16.     foreach($changed_sockets as $socket) { // просмотрим каждый из сокетов, который изменил свой статус
  17.       if($socket == $sockets["server"]) { // значит серверу пришли данные о установлении связи между клиентом и сервером
  18.     if (($client = socket_accept($sockets["server"])) >= 0) $sockets[] = $client; // если удалось установить связь, то добавляем в список всех сокетов
  19.       } else {
  20.     $index = array_search($socket, $sockets);
  21.     $len = @socket_recv($socket,$buffer,4096,0); // получаем информацию от сокета
  22.     if($len == 0) { // если статус сокета изменился, а данных нет, то значит сокет закрылся и мы должны убрать его из списка
  23.       unset($sockets[$index]);
  24.       unset($handshakes[$index]);
  25.       socket_close($socket);
  26.     }
  27.     else if(!isset($handshakes[$index])) { // говорили ли мы уже этому подключению, что мы - WebSocket?
  28.      $buffer = substr($buffer,strpos($buffer,"Sec-WebSocket-Key: ")+19);
  29.      $accept = base64_encode(sha1(substr($buffer,0,strpos($buffer,"\r\n")) . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
  30.      $upgrade  = "HTTP/1.1 101 Switching Protocols\r\n" .
  31.              "Upgrade: websocket\r\n" .
  32.              "Connection: Upgrade\r\n" .
  33.              "Sec-WebSocket-Accept: {$accept}\r\n\r\n" .
  34.              "Sec-Websocket-Extensions=x-webkit-deflate-frame"  . chr(0);
  35.  
  36.      socket_write($socket,$upgrade,strlen($upgrade)); // отправляем пакет о нас
  37.      $handshakes[$index] = true; // теперь сказали
  38.     }
  39.     else {
  40.       echo 'buf:'.$buffer."\r\n";
  41.     }
  42.       }
  43.     }
  44.   }
  45. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement