PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (2): [1] 2 »

> Найдено сообщений: 30
dvd2444 Отправлено: 25 Июля, 2014 - 16:39:38 • Тема: Работа кода на локальном компьютере и на хостинге • Форум: Вопросы новичков

Ответов: 3
Просмотров: 269
Если после 56 строки добавить это
PHP:
скопировать код в буфер обмена
  1. $data = socket_read($read_sock, 1024);
  2.                 $bytes = socket_recv($read_sock,$data,2048,0);
  3.                 // проверка подключен ли пользователь
  4.                 if ($bytes==0)
  5.                 {
  6.                     // удаление клиента из массива
  7.                     $this->close($read_sock);
  8.                     break;
  9.                 }

то пользователи не выходят все сразу а выходят как положено, но тогда для отправки сообщения его нужно писать 2 раза, что это за ерунда такая, не могу понять почему в первом варианте не работает
dvd2444 Отправлено: 25 Июля, 2014 - 12:47:36 • Тема: Работа кода на локальном компьютере и на хостинге • Форум: Вопросы новичков

Ответов: 3
Просмотров: 269
DeepVarvarРасположил код на бесплатном VPS хостинге https://vps[dot]ua[dot]До этого код отлично работал на локалхосте. Теперь когда я открываю несколько вкладок с пользователями http://31[dot]131[dot]24[dot]172/client[dot]html а потом закрываю одну, выходят все пользователи
Код сервера
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class testserver
  3. {    
  4.     var $host;
  5.     var $port;
  6.     var $socket;
  7.     var $model;
  8.     public static $clients;
  9.     function __construct($host,$port)
  10.     {
  11.         $this->host = $host;
  12.         $this->port = $port;
  13.         $this->socket=null;
  14.         $this->clients=array();
  15.         $this->users=array();
  16.         $this->model = new Model_server();
  17.     }
  18.    
  19.     public function run()                   //Запуск сервера
  20.     {
  21.         $this->start();
  22.        
  23.         $this->clients = array($this->socket);        
  24.         $null=null;
  25.         do
  26.         {
  27.             $read = $this->clients;
  28.             if (socket_select($read, $write = NULL, $except = NULL, 0) < 1) //ждем нового события
  29.             {
  30.                 continue;
  31.             }
  32.            
  33.             if (in_array($this->socket, $read))  //принимаем новые подключения
  34.             {
  35.                 // accept the client, and add him to the $clients array
  36.                 $this->clients[] = $newsock = socket_accept($this->socket);
  37.                 $data = socket_read($newsock, 1024);
  38.                 // send the client a welcome message
  39.                 $this->handshake($data,$newsock);
  40.                
  41.                 $msg = $newsock." connected to the server";
  42.                 $this->send($msg);
  43.                
  44.                 $msg = "<hr>".$msg."<hr>\n";
  45.                 $this->console($msg);
  46.                
  47.            
  48.                 //socket_getpeername($newsock, $ip);
  49.                 //echo " Client ip: {$ip}\n<hr>";
  50.            
  51.                 // remove the listening socket from the clients-with-data array
  52.                 $key = array_search($this->socket, $read);
  53.                 unset($read[$key]);
  54.             }
  55.            
  56.             foreach ($read as $read_sock)
  57.             {              
  58.                
  59.                 $data = socket_read($read_sock, 1024);
  60.                
  61.                 // проверка подключен ли пользователь
  62.                 if ($data === false)
  63.                 {
  64.                     // удаление клиента из массива
  65.                     $this->close($read_sock);
  66.                     break;
  67.                 }
  68.                 elseif(!isset($data[0]))
  69.                 {
  70.                     echo "2";
  71.                     $this->close($read_sock);
  72.                     break;
  73.                 }
  74.                 else
  75.                 {            
  76.                     // декодируем сообщение
  77.                    
  78.                     $data = $this->decode($data);  
  79.                    
  80.                     if($data['payload']=='close')
  81.                     {                        
  82.                         $this->close($read_sock);
  83.                         continue;
  84.                     }
  85.                     elseif($data['payload']=="online")
  86.                     {
  87.                         $this->console(count($this->clients)." users online<br />\n");
  88.                         $this->sendMessage(count($this->clients)." users online",$read_sock);
  89.                     }
  90.                     else
  91.                     {
  92.                         if($data['payload']!="")
  93.                         {
  94.                         $msg = trim($data['payload']);                        
  95.                         if($msg!=' ' && $msg!="")
  96.                         {
  97.                             $msg = $read_sock." Say: ".$msg;
  98.                             $this->send($msg);
  99.                             $this->console($msg."<br />\n");
  100.                         }
  101.                         }
  102.                     }
  103.                 }            
  104.             }  
  105.         }
  106.         while(true);
  107.        
  108.         end:                  //точка выхода из приложения(остановка сервера)
  109.         //
  110.         $this->shutdown();
  111.     }  
  112. //////////////////////////////////////////////////////////////      
  113.     private function send($msg,$type = 'text', $masked = false)//Отправка сообщения пользователю
  114.     {
  115.         $msg = $this->encode($msg,$type,$masked);
  116.         $i=1;
  117.         $num=0;
  118.         foreach ($this->clients as $read_sock)
  119.         {
  120.             if($num>=1)
  121.             {
  122.                 socket_write($read_sock,$msg,strlen($msg));  
  123.             }
  124.             $num++;
  125.         }
  126.     }
  127. /////////////////////////////////////////////////////////////  
  128.     private function sendMessage($msg,$read_sock,$type = 'text', $masked = false)//Отправка сообщения пользователю
  129.     {
  130.         $msg = $this->encode($msg,$type,$masked);
  131.         socket_write($read_sock,$msg,strlen($msg));
  132.     }
  133.    
  134. //////////////////////////////////////////////////////////////      
  135.     private function close($read_sock)                         //Закрывает конкретное соединение
  136.     {
  137.         if(isset($read_sock))
  138.         {
  139.            echo "1";
  140.             //socket_close($read_sock);
  141.             if(($key = array_search($read_sock, $this->clients))>=0)
  142.             {
  143.                 unset($this->clients[$key]);
  144.             }                
  145.             //$this->console($read_sock." Disconnected <br />");
  146.             //$this->send($read_sock." Disconnected");
  147.         }
  148.     }
  149.    
  150. //////////////////////////////////////////////////////////////      
  151.     private function shutdown()                             //Остановка всего сервера
  152.     {
  153.         if (isset($this->socket))
  154.         {            
  155.             socket_close($this->socket);
  156.             $this->console("<br /><hr>Server shutdown---OK <br /><hr>");
  157.             return;
  158.         }
  159.     }
  160. //////////////////////////////////////////////////////////////
  161.      private function start()
  162.     {
  163.          
  164.              $this->console("-=SERVER v2.1=-<hr>\n");
  165.             $this->console("Socket create ------");
  166.             if(($this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP))===false)
  167.             {
  168.                 $this->console("Error...".socket_strerror(socket_last_error())."<br />\n");    
  169.             }
  170.             else
  171.             {
  172.                 $this->console("OK<br />\n");
  173.             }
  174.  
  175.             $this->console("Socket bind --------");
  176.             //привязываем его к указанным ip и порту
  177.             if((socket_bind($this->socket, $this->host, $this->port))===false)
  178.             {
  179.                 $this->console("Error...".socket_strerror(socket_last_error())."<br />\n");    
  180.             }
  181.             else
  182.             {
  183.              $this->console("OK <br />\n");
  184.             }
  185.  
  186.             socket_set_option($this->socket, SOL_SOCKET, SO_REUSEADDR, 1);//разрешаем использовать один порт для нескольких соединений
  187.  
  188.             $this->console("Socket listening-----");
  189.             if(($listen = socket_listen($this->socket))===false)
  190.             {
  191.                 $this->console("Error...".socket_strerror(socket_last_error())."<br />\n");
  192.                 exit();
  193.             }
  194.             else
  195.             {
  196.                 $this->console("OK <br />\n");
  197.             }
  198.             $this->console("Server started-------OK<hr>\n");
  199.             //
  200.     }
  201. //////////////////////////////////////////////////////////////      
  202.     private function handshake($receved_header,$client_conn)//выполняет рукопожатие сервера и клиента
  203.     {
  204.         $headers = array();
  205.         $lines = preg_split("/\r\n/", $receved_header);
  206.         foreach($lines as $line)
  207.         {
  208.                 $line = chop($line);
  209.                 if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
  210.                 {
  211.                         $headers[$matches[1]] = $matches[2];
  212.                 }
  213.         }
  214.  
  215.         $secKey = $headers['Sec-WebSocket-Key'];
  216.         $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
  217.         //hand shaking header
  218.         $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
  219.         "Upgrade: websocket\r\n" .
  220.         "Connection: Upgrade\r\n" .
  221.         "Sec-WebSocket-Origin: http://$this->host\r\n" .
  222.         "Sec-WebSocket-Location: ws://$this->host:$this->port\r\n".
  223.         "Sec-WebSocket-Accept: $secAccept\r\n\r\n";
  224.         socket_write($client_conn,$upgrade,strlen($upgrade));
  225.     }
  226. //////////////////////////////////////////////////////////////      
  227.     private function decode($data)                          //Декорирует сообщение пришедшее от пользователся
  228.     {
  229.         $payloadLength = '';
  230.                 $mask = '';
  231.                 $unmaskedPayload = '';
  232.                 $decodedData = array();
  233.  
  234.                 // estimate frame type:
  235.                 $firstByteBinary = sprintf('%08b', ord($data[0]));             
  236.                 $secondByteBinary = sprintf('%08b', ord($data[1]));
  237.                 $opcode = bindec(substr($firstByteBinary, 4, 4));
  238.                 $isMasked = ($secondByteBinary[0] == '1') ? true : false;
  239.                 $payloadLength = ord($data[1]) & 127;
  240.  
  241.                 // close connection if unmasked frame is received:
  242.                 if($isMasked === false)
  243.                 {
  244.                         //$this->close(1002);
  245.                 }
  246.  
  247.                 switch($opcode)
  248.                 {
  249.                         // text frame:
  250.                         case 1:
  251.                                 $decodedData['type'] = 'text';                         
  252.                         break;
  253.  
  254.                         case 2:
  255.                                 $decodedData['type'] = 'binary';
  256.                         break;
  257.  
  258.                         // connection close frame:
  259.                         case 8:
  260.                                 $decodedData['type'] = 'close';
  261.                         break;
  262.  
  263.                         // ping frame:
  264.                         case 9:
  265.                                 $decodedData['type'] = 'ping';                         
  266.                         break;
  267.  
  268.                         // pong frame:
  269.                         case 10:
  270.                                 $decodedData['type'] = 'pong';
  271.                         break;
  272.  
  273.                         default:
  274.                                 // Close connection on unknown opcode:
  275.                                 //$this->close(1003);
  276.                         break;
  277.                 }
  278.  
  279.                 if($payloadLength === 126)
  280.                 {
  281.                    $mask = substr($data, 4, 4);
  282.                    $payloadOffset = 8;
  283.                    $dataLength = bindec(sprintf('%08b', ord($data[2])) . sprintf('%08b', ord($data[3]))) + $payloadOffset;
  284.                 }
  285.                 elseif($payloadLength === 127)
  286.                 {
  287.                         $mask = substr($data, 10, 4);
  288.                         $payloadOffset = 14;
  289.                         $tmp = '';
  290.                         for($i = 0; $i < 8; $i++)
  291.                         {
  292.                                 $tmp .= sprintf('%08b', ord($data[$i+2]));
  293.                         }
  294.                         $dataLength = bindec($tmp) + $payloadOffset;
  295.                         unset($tmp);
  296.                 }
  297.                 else
  298.                 {
  299.                         $mask = substr($data, 2, 4);   
  300.                         $payloadOffset = 6;
  301.                         $dataLength = $payloadLength + $payloadOffset;
  302.                 }
  303.  
  304.                 /**
  305.                  * We have to check for large frames here. socket_recv cuts at 1024 bytes
  306.                  * so if websocket-frame is > 1024 bytes we have to wait until whole
  307.                  * data is transferd.
  308.                  */
  309.                 if(strlen($data) < $dataLength)
  310.                 {                      
  311.                         return false;
  312.                 }
  313.  
  314.                 if($isMasked === true)
  315.                 {
  316.                         for($i = $payloadOffset; $i < $dataLength; $i++)
  317.                         {
  318.                                 $j = $i - $payloadOffset;
  319.                                 if(isset($data[$i]))
  320.                                 {
  321.                                         $unmaskedPayload .= $data[$i] ^ $mask[$j % 4];
  322.                                 }
  323.                         }
  324.                         $decodedData['payload'] = $unmaskedPayload;
  325.                 }
  326.                 else
  327.                 {
  328.                         $payloadOffset = $payloadOffset - 4;
  329.                         $decodedData['payload'] = substr($data, $payloadOffset);
  330.                 }
  331.  
  332.                 return $decodedData;
  333.     }
  334. //////////////////////////////////////////////////////////////      
  335.     private function encode($payload, $type, $masked)//Кодирует сообщение перед отправкой пользователю
  336.     {
  337.         $frameHead = array();
  338.                 $frame = '';
  339.                 $payloadLength = strlen($payload);
  340.  
  341.                 switch($type)
  342.                 {              
  343.                         case 'text':
  344.                                 // first byte indicates FIN, Text-Frame (10000001):
  345.                                 $frameHead[0] = 129;                           
  346.                         break;                 
  347.  
  348.                         case 'close':
  349.                                 // first byte indicates FIN, Close Frame(10001000):
  350.                                 $frameHead[0] = 136;
  351.                         break;
  352.  
  353.                         case 'ping':
  354.                                 // first byte indicates FIN, Ping frame (10001001):
  355.                                 $frameHead[0] = 137;
  356.                         break;
  357.  
  358.                         case 'pong':
  359.                                 // first byte indicates FIN, Pong frame (10001010):
  360.                                 $frameHead[0] = 138;
  361.                         break;
  362.                 }
  363.  
  364.                 // set mask and payload length (using 1, 3 or 9 bytes)
  365.                 if($payloadLength > 65535)
  366.                 {
  367.                         $payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
  368.                         $frameHead[1] = ($masked === true) ? 255 : 127;
  369.                         for($i = 0; $i < 8; $i++)
  370.                         {
  371.                                 $frameHead[$i+2] = bindec($payloadLengthBin[$i]);
  372.                         }
  373.                         // most significant bit MUST be 0 (close connection if frame too big)
  374.                         if($frameHead[2] > 127)
  375.                         {
  376.                                 $this->close(1004);
  377.                                 return false;
  378.                         }
  379.                 }
  380.                 elseif($payloadLength > 125)
  381.                 {
  382.                         $payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
  383.                         $frameHead[1] = ($masked === true) ? 254 : 126;
  384.                         $frameHead[2] = bindec($payloadLengthBin[0]);
  385.                         $frameHead[3] = bindec($payloadLengthBin[1]);
  386.                 }
  387.                 else
  388.                 {
  389.                         $frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength;
  390.                 }
  391.  
  392.                 // convert frame-head to string:
  393.                 foreach(array_keys($frameHead) as $i)
  394.                 {
  395.                         $frameHead[$i] = chr($frameHead[$i]);
  396.                 }
  397.                 if($masked === true)
  398.                 {
  399.                         // generate a random mask:
  400.                         $mask = array();
  401.                         for($i = 0; $i < 4; $i++)
  402.                         {
  403.                                 $mask[$i] = chr(rand(0, 255));
  404.                         }
  405.  
  406.                         $frameHead = array_merge($frameHead, $mask);                   
  407.                 }                                              
  408.                 $frame = implode('', $frameHead);
  409.  
  410.                 // append payload to frame:
  411.                 $framePayload = array();       
  412.                 for($i = 0; $i < $payloadLength; $i++)
  413.                 {              
  414.                         $frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
  415.                 }
  416.  
  417.                 return $frame;
  418.     }
  419. }
  420.  
dvd2444 Отправлено: 24 Июля, 2014 - 17:42:00 • Тема: Работа кода на локальном компьютере и на хостинге • Форум: Вопросы новичков

Ответов: 3
Просмотров: 269
Есть код который отлично работает на локалхосте, но при переносе его на сервер криво стали работать некоторые функции связанные с веб сокетами(при выходе одного пользователя отключаются все соединения пользователей). Конфигурация рнр на сервере такая же как и на хостинге. Что может влиять на работу кода?
dvd2444 Отправлено: 21 Июля, 2014 - 22:23:29 • Тема: Прерывание websocket соединения • Форум: Работа с сетью

Ответов: 0
Просмотров: 1160
Есть сервер к которому подключаются пользователи по веб сокет соединению.Если пользователь закрывает вкладку браузера у всех остальных должно выпасть сообщение что конкретный пользователь вышел.Но у меня при выходе одного юзера выключаются все активные соединения.Прошу помощи, вот код.Функция отключения пользователя на 142 строке
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4. class Server
  5. {    
  6.     var $host;
  7.     var $port;
  8.     var $socket;
  9.     var $model;
  10.     var $clients;
  11.     function __construct($host,$port)
  12.     {
  13.         $this->host = $host;
  14.         $this->port = $port;
  15.         $this->socket=null;
  16.         $this->clients=array();
  17.         $this->users=array();
  18.         $this->model = new Model_server();
  19.     }
  20.    
  21.     public function run()                   //Запуск сервера
  22.     {
  23.         $this->start();
  24.        
  25.         $this->clients = array($this->socket);        
  26.         $null=null;
  27.         do
  28.         {
  29.             $read = $this->clients;
  30.             if (socket_select($read, $write = NULL, $except = NULL, 0) < 1) //ждем нового события
  31.             {
  32.                 continue;
  33.             }
  34.            
  35.             if (in_array($this->socket, $read))  //принимаем новые подключения
  36.             {
  37.                 // accept the client, and add him to the $clients array
  38.                 $this->clients[] = $newsock = socket_accept($this->socket);
  39.                 $data = socket_read($newsock, 1024);
  40.                 // send the client a welcome message
  41.                 $this->handshake($data,$newsock);
  42.                
  43.                 $msg = $newsock." connected to the server";
  44.                 $this->send($msg);
  45.                
  46.                 $msg = "<hr>".$msg."<hr>\n";
  47.                 $this->console($msg);
  48.                
  49.            
  50.                 //socket_getpeername($newsock, $ip);
  51.                 //echo " Client ip: {$ip}\n<hr>";
  52.            
  53.                 // remove the listening socket from the clients-with-data array
  54.                 $key = array_search($this->socket, $read);
  55.                 unset($read[$key]);
  56.             }
  57.            
  58.             foreach ($read as $read_sock)
  59.             {              
  60.                
  61.                 $data = socket_read($read_sock, 1024);
  62.                 if (!isset($data))
  63.                 {
  64.                     continue;
  65.                 }
  66.                 // проверка подключен ли пользователь
  67.                 if ($data === false)
  68.                 {
  69.                     // удаление клиента из массива
  70.                     $this->close($read_sock);
  71.                     continue;
  72.                 }
  73.                 else
  74.                 {            
  75.                     // декодируем сообщение
  76.                    
  77.                     $data = $this->decode($data);  
  78.                     $msg = explode(":",$data['payload']);
  79.                    
  80.                     if($data['payload']=='close')
  81.                     {                        
  82.                         $this->close($read_sock);
  83.                         continue;
  84.                     }
  85.                     elseif($data['payload']=="online")
  86.                     {
  87.                         $this->console(count($this->clients)." users online<br />\n");
  88.                         $this->sendMessage(count($this->clients)." users online",$read_sock);
  89.                     }
  90.                     else
  91.                     {
  92.                         if($data['payload']!="")
  93.                         {
  94.                         $msg = trim($data['payload']);                        
  95.                         if($msg!=' ' && $msg!="")
  96.                         {
  97.                             $msg = $read_sock." Say: ".$msg;
  98.                             $this->send($msg);
  99.                             $this->console($msg."<br />\n");
  100.                         }
  101.                         }
  102.                     }
  103.                 }
  104.            
  105.             }  
  106.            
  107.             $this->event();
  108.         }
  109.         while(true);
  110.        
  111.         //
  112.         $this->shutdown();
  113.     }
  114. //////////////////////////////////////////////////////////////    
  115.     private function console($msg,$decode=false)            //вывод сообщения присланные клиентом на сервере
  116.     {
  117.             echo iconv('windows-1251','utf-8' ,$msg);        
  118.     }
  119. //////////////////////////////////////////////////////////////      
  120.     private function send($msg,$type = 'text', $masked = false)//Отправка сообщения пользователю
  121.     {
  122.         $msg = $this->encode($msg,$type,$masked);
  123.         $i=1;
  124.         $num=0;
  125.         foreach ($this->clients as $read_sock)
  126.         {
  127.             if($num>=1)
  128.             {
  129.                 socket_write($read_sock,$msg,strlen($msg));  
  130.             }
  131.             $num++;
  132.         }
  133.     }
  134. /////////////////////////////////////////////////////////////  
  135.     private function sendMessage($msg,$read_sock,$type = 'text', $masked = false)//Отправка сообщения пользователю
  136.     {
  137.         $msg = $this->encode($msg,$type,$masked);
  138.         socket_write($read_sock,$msg,strlen($msg));
  139.     }
  140.    
  141. //////////////////////////////////////////////////////////////      
  142.     private function close($read_sock)                         //Закрывает конкретное соединение
  143.     {
  144.         if(isset($read_sock))
  145.         {
  146.            
  147.             //socket_close($read_sock);
  148.             if(($key = array_search($read_sock, $this->clients))>=0)
  149.             {
  150.                 unset($this->clients[$key]);
  151.             }    
  152.             $this->console($read_sock." Disconnected <br />");
  153.             $this->send($read_sock." Disconnected");
  154.         }
  155.     }
  156.    
  157. //////////////////////////////////////////////////////////////      
  158.     private function shutdown()                             //Остановка всего сервера
  159.     {
  160.         if (isset($this->socket))
  161.         {            
  162.             socket_close($this->socket);
  163.             $this->console("<br /><hr>Server shutdown---OK <br /><hr>");
  164.             return;
  165.         }
  166.     }
  167. //////////////////////////////////////////////////////////////
  168.      private function start()
  169.     {
  170.          
  171.              $this->console("-=SERVER v2.1=-<hr>\n");
  172.             $this->console("Socket create ------");
  173.             if(($this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP))===false)
  174.             {
  175.                 $this->console("Error...".socket_strerror(socket_last_error())."<br />\n");    
  176.             }
  177.             else
  178.             {
  179.                 $this->console("OK<br />\n");
  180.             }
  181.  
  182.             $this->console("Socket bind --------");
  183.             //привязываем его к указанным ip и порту
  184.             if((socket_bind($this->socket, $this->host, $this->port))===false)
  185.             {
  186.                 $this->console("Error...".socket_strerror(socket_last_error())."<br />\n");    
  187.             }
  188.             else
  189.             {
  190.              $this->console("OK <br />\n");
  191.             }
  192.  
  193.             socket_set_option($this->socket, SOL_SOCKET, SO_REUSEADDR, 1);//разрешаем использовать один порт для нескольких соединений
  194.  
  195.             $this->console("Socket listening-----");
  196.             if(($listen = socket_listen($this->socket))===false)
  197.             {
  198.                 $this->console("Error...".socket_strerror(socket_last_error())."<br />\n");
  199.                 exit();
  200.             }
  201.             else
  202.             {
  203.                 $this->console("OK <br />\n");
  204.             }
  205.             $this->console("Server started-------OK<hr>\n");
  206.             //
  207.     }
  208. //////////////////////////////////////////////////////////////      
  209.     private function handshake($receved_header,$client_conn)//выполняет рукопожатие сервера и клиента
  210.     {
  211.         $headers = array();
  212.         $lines = preg_split("/\r\n/", $receved_header);
  213.         foreach($lines as $line)
  214.         {
  215.                 $line = chop($line);
  216.                 if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
  217.                 {
  218.                         $headers[$matches[1]] = $matches[2];
  219.                 }
  220.         }
  221.  
  222.         $secKey = $headers['Sec-WebSocket-Key'];
  223.         $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
  224.         //hand shaking header
  225.         $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
  226.         "Upgrade: websocket\r\n" .
  227.         "Connection: Upgrade\r\n" .
  228.         "Sec-WebSocket-Origin: http://$this->host\r\n" .
  229.         "Sec-WebSocket-Location: ws://$this->host:$this->port\r\n".
  230.         "Sec-WebSocket-Accept: $secAccept\r\n\r\n";
  231.         socket_write($client_conn,$upgrade,strlen($upgrade));
  232.     }
  233. //////////////////////////////////////////////////////////////      
  234.     private function decode($data)                          //Декорирует сообщение пришедшее от пользователся
  235.     {
  236.         $payloadLength = '';
  237.                 $mask = '';
  238.                 $unmaskedPayload = '';
  239.                 $decodedData = array();
  240.  
  241.                 // estimate frame type:
  242.                 $firstByteBinary = sprintf('%08b', ord($data[0]));             
  243.                 $secondByteBinary = sprintf('%08b', ord($data[1]));
  244.                 $opcode = bindec(substr($firstByteBinary, 4, 4));
  245.                 $isMasked = ($secondByteBinary[0] == '1') ? true : false;
  246.                 $payloadLength = ord($data[1]) & 127;
  247.  
  248.                 // close connection if unmasked frame is received:
  249.                 if($isMasked === false)
  250.                 {
  251.                         //$this->close(1002);
  252.                 }
  253.  
  254.                 switch($opcode)
  255.                 {
  256.                         // text frame:
  257.                         case 1:
  258.                                 $decodedData['type'] = 'text';                         
  259.                         break;
  260.  
  261.                         case 2:
  262.                                 $decodedData['type'] = 'binary';
  263.                         break;
  264.  
  265.                         // connection close frame:
  266.                         case 8:
  267.                                 $decodedData['type'] = 'close';
  268.                         break;
  269.  
  270.                         // ping frame:
  271.                         case 9:
  272.                                 $decodedData['type'] = 'ping';                         
  273.                         break;
  274.  
  275.                         // pong frame:
  276.                         case 10:
  277.                                 $decodedData['type'] = 'pong';
  278.                         break;
  279.  
  280.                         default:
  281.                                 // Close connection on unknown opcode:
  282.                                 //$this->close(1003);
  283.                         break;
  284.                 }
  285.  
  286.                 if($payloadLength === 126)
  287.                 {
  288.                    $mask = substr($data, 4, 4);
  289.                    $payloadOffset = 8;
  290.                    $dataLength = bindec(sprintf('%08b', ord($data[2])) . sprintf('%08b', ord($data[3]))) + $payloadOffset;
  291.                 }
  292.                 elseif($payloadLength === 127)
  293.                 {
  294.                         $mask = substr($data, 10, 4);
  295.                         $payloadOffset = 14;
  296.                         $tmp = '';
  297.                         for($i = 0; $i < 8; $i++)
  298.                         {
  299.                                 $tmp .= sprintf('%08b', ord($data[$i+2]));
  300.                         }
  301.                         $dataLength = bindec($tmp) + $payloadOffset;
  302.                         unset($tmp);
  303.                 }
  304.                 else
  305.                 {
  306.                         $mask = substr($data, 2, 4);   
  307.                         $payloadOffset = 6;
  308.                         $dataLength = $payloadLength + $payloadOffset;
  309.                 }
  310.  
  311.                 /**
  312.                  * We have to check for large frames here. socket_recv cuts at 1024 bytes
  313.                  * so if websocket-frame is > 1024 bytes we have to wait until whole
  314.                  * data is transferd.
  315.                  */
  316.                 if(strlen($data) < $dataLength)
  317.                 {                      
  318.                         return false;
  319.                 }
  320.  
  321.                 if($isMasked === true)
  322.                 {
  323.                         for($i = $payloadOffset; $i < $dataLength; $i++)
  324.                         {
  325.                                 $j = $i - $payloadOffset;
  326.                                 if(isset($data[$i]))
  327.                                 {
  328.                                         $unmaskedPayload .= $data[$i] ^ $mask[$j % 4];
  329.                                 }
  330.                         }
  331.                         $decodedData['payload'] = $unmaskedPayload;
  332.                 }
  333.                 else
  334.                 {
  335.                         $payloadOffset = $payloadOffset - 4;
  336.                         $decodedData['payload'] = substr($data, $payloadOffset);
  337.                 }
  338.  
  339.                 return $decodedData;
  340.     }
  341. //////////////////////////////////////////////////////////////      
  342.     private function encode($payload, $type, $masked)//Кодирует сообщение перед отправкой пользователю
  343.     {
  344.         $frameHead = array();
  345.                 $frame = '';
  346.                 $payloadLength = strlen($payload);
  347.  
  348.                 switch($type)
  349.                 {              
  350.                         case 'text':
  351.                                 // first byte indicates FIN, Text-Frame (10000001):
  352.                                 $frameHead[0] = 129;                           
  353.                         break;                 
  354.  
  355.                         case 'close':
  356.                                 // first byte indicates FIN, Close Frame(10001000):
  357.                                 $frameHead[0] = 136;
  358.                         break;
  359.  
  360.                         case 'ping':
  361.                                 // first byte indicates FIN, Ping frame (10001001):
  362.                                 $frameHead[0] = 137;
  363.                         break;
  364.  
  365.                         case 'pong':
  366.                                 // first byte indicates FIN, Pong frame (10001010):
  367.                                 $frameHead[0] = 138;
  368.                         break;
  369.                 }
  370.  
  371.                 // set mask and payload length (using 1, 3 or 9 bytes)
  372.                 if($payloadLength > 65535)
  373.                 {
  374.                         $payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
  375.                         $frameHead[1] = ($masked === true) ? 255 : 127;
  376.                         for($i = 0; $i < 8; $i++)
  377.                         {
  378.                                 $frameHead[$i+2] = bindec($payloadLengthBin[$i]);
  379.                         }
  380.                         // most significant bit MUST be 0 (close connection if frame too big)
  381.                         if($frameHead[2] > 127)
  382.                         {
  383.                                 //$this->close(1004);
  384.                                 return false;
  385.                         }
  386.                 }
  387.                 elseif($payloadLength > 125)
  388.                 {
  389.                         $payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
  390.                         $frameHead[1] = ($masked === true) ? 254 : 126;
  391.                         $frameHead[2] = bindec($payloadLengthBin[0]);
  392.                         $frameHead[3] = bindec($payloadLengthBin[1]);
  393.                 }
  394.                 else
  395.                 {
  396.                         $frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength;
  397.                 }
  398.  
  399.                 // convert frame-head to string:
  400.                 foreach(array_keys($frameHead) as $i)
  401.                 {
  402.                         $frameHead[$i] = chr($frameHead[$i]);
  403.                 }
  404.                 if($masked === true)
  405.                 {
  406.                         // generate a random mask:
  407.                         $mask = array();
  408.                         for($i = 0; $i < 4; $i++)
  409.                         {
  410.                                 $mask[$i] = chr(rand(0, 255));
  411.                         }
  412.  
  413.                         $frameHead = array_merge($frameHead, $mask);                   
  414.                 }                                              
  415.                 $frame = implode('', $frameHead);
  416.  
  417.                 // append payload to frame:
  418.                 $framePayload = array();       
  419.                 for($i = 0; $i < $payloadLength; $i++)
  420.                 {              
  421.                         $frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
  422.                 }
  423.  
  424.                 return $frame;
  425.     }
  426. }
  427.  
  428.  
dvd2444 Отправлено: 21 Июля, 2014 - 19:08:30 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков

Ответов: 9
Просмотров: 546
Решением было разместить сервер в интернете.Похоже ява все равно что у вас в файле хост какой то урл переопределен. Нужно покупать впс сервер или хостинг где поддерживается бесконечное исполнение скрипта.
dvd2444 Отправлено: 17 Июля, 2014 - 21:32:55 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков

Ответов: 9
Просмотров: 546
Может ли моя проблема быть связанна с тем что сервер находится на локальной машине?
И как можно проверить была ли попытка в принципе подключиться к серверу?
dvd2444 Отправлено: 17 Июля, 2014 - 16:50:05 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков

Ответов: 9
Просмотров: 546
Ну так что, есть идеи?
dvd2444 Отправлено: 16 Июля, 2014 - 21:15:54 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков

Ответов: 9
Просмотров: 546
OrmaJever
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. class Server
  3. {    
  4.    var $host;
  5.    var $port;
  6.    var $socket;
  7.    var $model;
  8.    var $clients;
  9.    function __construct($host,$port)
  10.    {
  11.        $this->host = $host;
  12.        $this->port = $port;
  13.        $this->socket=null;
  14.        $this->clients=array();
  15.        $this->users=array();
  16.        $this->model = new Model_server();
  17.    }
  18.    
  19.    public function run()                   //Запуск сервера
  20.    {
  21.        $this->start();
  22.        
  23.        $this->clients = array($this->socket);        
  24.        $null=null;
  25.        do
  26.        {
  27.            $read = $this->clients;
  28.            if (socket_select($read, $write = NULL, $except = NULL, 0) < 1) //ждем нового события
  29.            {
  30.                continue;
  31.            }
  32.            
  33.            
  34.            if (in_array($this->socket, $read))  //принимаем новые подключения
  35.            {
  36.                // accept the client, and add him to the $clients array
  37.                $this->clients[] = $newsock = socket_accept($this->socket);
  38.                $data = socket_read($newsock, 1024);
  39.                // send the client a welcome message
  40.                $this->handshake($data,$newsock);
  41.                
  42.                $msg = $newsock." connected to the server";
  43.                $this->send($msg);
  44.                
  45.                $msg = "<hr>".$msg."<hr>\n";
  46.                $this->console($msg);
  47.                
  48.            
  49.                //socket_getpeername($newsock, $ip);
  50.                //echo " Client ip: {$ip}\n<hr>";
  51.            
  52.                // remove the listening socket from the clients-with-data array
  53.                $key = array_search($this->socket, $read);
  54.                unset($read[$key]);
  55.            }
  56.            
  57.            foreach ($read as $read_sock)
  58.            {              
  59.                
  60.                $data = socket_read($read_sock, 1024);
  61.                
  62.                // проверка подключен ли пользователь
  63.                if ($data === false)
  64.                {
  65.                    // удаление клиента из массива
  66.                    $this->close($read_sock);
  67.                    continue;
  68.                }
  69.                else
  70.                {            
  71.                    // декодируем сообщение
  72.                    
  73.                    $data = $this->decode($data);  
  74.                    
  75.                    if($data['payload']=='close')
  76.                    {                        
  77.                        $this->close($read_sock);
  78.                        continue;
  79.                    }
  80.                    elseif($data['payload']=="online")
  81.                    {
  82.                        $this->console(count($this->clients)." users online<br />\n");
  83.                        $this->sendMessage(count($this->clients)." users online",$read_sock);
  84.                    }
  85.                    else
  86.                    {
  87.                        if($data['payload']!="")
  88.                        {
  89.                        $msg = trim(iconv('utf-8','utf-8' ,$data['payload']));                        
  90.                        if($msg!=' ' && $msg!="")
  91.                        {
  92.                            $msg = $read_sock." Say: ".$msg;
  93.                            $this->send($msg);
  94.                            $this->console($msg."<br />\n");
  95.                        }
  96.                        }
  97.                    }
  98.                }
  99.            
  100.            }  
  101.            
  102.        }
  103.        while(true);
  104.      
  105.        //
  106.        $this->shutdown();
  107.    }  
  108. //////////////////////////////////////////////////////////////    
  109.    private function console($msg,$decode=false)            //вывод сообщения присланные клиентом на сервере
  110.    {
  111.        if($decode==false)
  112.        {
  113.            foreach ($this->users as $value)
  114.            {
  115.                if($value->identificate=="1")
  116.                {
  117.                    $ms = Server::encode($msg,"text",false);
  118.                    socket_write($value->connection,$ms,strlen($ms));
  119.                }
  120.            }
  121.            echo $msg;
  122.        }
  123.        else
  124.        {
  125.            $msg = server::decode($data);
  126.            echo iconv('windows-1251','utf-8' ,$msg);
  127.        }
  128.    }
  129. //////////////////////////////////////////////////////////////      
  130.    private function send($msg,$type = 'text', $masked = false)//Отправка сообщения пользователю
  131.    {
  132.        $msg = Server::encode($msg,$type,$masked);
  133.        $i=1;
  134.        $num=0;
  135.        foreach ($this->clients as $read_sock)
  136.        {
  137.            if($num>=1)
  138.            {
  139.                socket_write($read_sock,$msg,strlen($msg));  
  140.            }
  141.            $num++;
  142.        }
  143.    }
  144. /////////////////////////////////////////////////////////////  
  145.    private function sendMessage($msg,$read_sock,$type = 'text', $masked = false)//Отправка сообщения пользователю
  146.    {
  147.        $msg = Server::encode($msg,$type,$masked);
  148.        socket_write($read_sock,$msg,strlen($msg));
  149.    }
  150.    
  151. //////////////////////////////////////////////////////////////      
  152.    private function close($read_sock)                         //Закрывает конкретное соединение
  153.    {
  154.        if(isset($read_sock))
  155.        {
  156.            $this->console($read_sock." Disconnected <br />");
  157.            $this->send($read_sock." Disconnected");
  158.            //socket_close($read_sock);
  159.            if(($key = array_search($read_sock, $this->clients))>0)
  160.            {
  161.                unset($this->clients[$key]);
  162.            }                
  163.        }
  164.    }
  165.    
  166. //////////////////////////////////////////////////////////////      
  167.    private function shutdown()                             //Остановка всего сервера
  168.    {
  169.        if (isset($this->socket))
  170.        {            
  171.            socket_close($this->socket);
  172.            $this->console("<br /><hr>Server shutdown---OK <br /><hr>");
  173.            return;
  174.        }
  175.    }
  176. //////////////////////////////////////////////////////////////
  177.     private function start()
  178.    {
  179.        
  180.             $this->console("-=SERVER v2.1=-<hr>\n");
  181.            $this->console("Socket create ------");
  182.            if(($this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP))===false)
  183.            {
  184.                $this->console("Error...".socket_strerror(socket_last_error())."<br />\n");    
  185.            }
  186.            else
  187.            {
  188.                $this->console("OK<br />\n");
  189.            }
  190.  
  191.            $this->console("Socket bind --------");
  192.            //привязываем его к указанным ip и порту
  193.            if((socket_bind($this->socket, $this->host, $this->port))===false)
  194.            {
  195.                $this->console("Error...".socket_strerror(socket_last_error())."<br />\n");    
  196.            }
  197.            else
  198.            {
  199.             $this->console("OK <br />\n");
  200.            }
  201.  
  202.            socket_set_option($this->socket, SOL_SOCKET, SO_REUSEADDR, 1);//разрешаем использовать один порт для нескольких соединений
  203.  
  204.            $this->console("Socket listening-----");
  205.            if(($listen = socket_listen($this->socket))===false)
  206.            {
  207.                $this->console("Error...".socket_strerror(socket_last_error())."<br />\n");
  208.                exit();
  209.            }
  210.            else
  211.            {
  212.                $this->console("OK <br />\n");
  213.            }
  214.            $this->console("Server started-------OK<hr>\n");
  215.            //
  216.    }
  217. //////////////////////////////////////////////////////////////      
  218.    private function handshake($receved_header,$client_conn)//выполняет рукопожатие сервера и клиента
  219.    {
  220.        $headers = array();
  221.         $lines = preg_split("/\r\n/", $receved_header);
  222.         foreach($lines as $line)
  223.         {
  224.                 $line = chop($line);
  225.                 if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
  226.                 {
  227.                         $headers[$matches[1]] = $matches[2];
  228.                 }
  229.         }
  230.  
  231.         $secKey = $headers['Sec-WebSocket-Key'];
  232.         $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
  233.         //hand shaking header
  234.         $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
  235.         "Upgrade: websocket\r\n" .
  236.         "Connection: Upgrade\r\n" .
  237.         "Sec-WebSocket-Origin: http://$this->host\r\n" .
  238.         "Sec-WebSocket-Location: ws://$this->host:$this->port\r\n".
  239.         "Sec-WebSocket-Accept: $secAccept\r\n\r\n";
  240.         socket_write($client_conn,$upgrade,strlen($upgrade));
  241.    }
  242. //////////////////////////////////////////////////////////////      
  243.    private function decode($data)                          //Декорирует сообщение пришедшее от пользователся
  244.    {
  245.        $payloadLength = '';
  246.                 $mask = '';
  247.                 $unmaskedPayload = '';
  248.                 $decodedData = array();
  249.  
  250.                 // estimate frame type:
  251.                 $firstByteBinary = sprintf('%08b', ord($data[0]));             
  252.                 $secondByteBinary = sprintf('%08b', ord($data[1]));
  253.                 $opcode = bindec(substr($firstByteBinary, 4, 4));
  254.                 $isMasked = ($secondByteBinary[0] == '1') ? true : false;
  255.                 $payloadLength = ord($data[1]) & 127;
  256.  
  257.                 // close connection if unmasked frame is received:
  258.                 if($isMasked === false)
  259.                 {
  260.                         $this->close(1002);
  261.                 }
  262.  
  263.                 switch($opcode)
  264.                 {
  265.                         // text frame:
  266.                         case 1:
  267.                                 $decodedData['type'] = 'text';                         
  268.                         break;
  269.  
  270.                         case 2:
  271.                                 $decodedData['type'] = 'binary';
  272.                         break;
  273.  
  274.                         // connection close frame:
  275.                         case 8:
  276.                                 $decodedData['type'] = 'close';
  277.                         break;
  278.  
  279.                         // ping frame:
  280.                         case 9:
  281.                                 $decodedData['type'] = 'ping';                         
  282.                         break;
  283.  
  284.                         // pong frame:
  285.                         case 10:
  286.                                 $decodedData['type'] = 'pong';
  287.                         break;
  288.  
  289.                         default:
  290.                                 // Close connection on unknown opcode:
  291.                                 $this->close(1003);
  292.                         break;
  293.                 }
  294.  
  295.                 if($payloadLength === 126)
  296.                 {
  297.                    $mask = substr($data, 4, 4);
  298.                    $payloadOffset = 8;
  299.                    $dataLength = bindec(sprintf('%08b', ord($data[2])) . sprintf('%08b', ord($data[3]))) + $payloadOffset;
  300.                 }
  301.                 elseif($payloadLength === 127)
  302.                 {
  303.                         $mask = substr($data, 10, 4);
  304.                         $payloadOffset = 14;
  305.                         $tmp = '';
  306.                         for($i = 0; $i < 8; $i++)
  307.                         {
  308.                                 $tmp .= sprintf('%08b', ord($data[$i+2]));
  309.                         }
  310.                         $dataLength = bindec($tmp) + $payloadOffset;
  311.                         unset($tmp);
  312.                 }
  313.                 else
  314.                 {
  315.                         $mask = substr($data, 2, 4);   
  316.                         $payloadOffset = 6;
  317.                         $dataLength = $payloadLength + $payloadOffset;
  318.                 }
  319.  
  320.                 /**
  321.                  * We have to check for large frames here. socket_recv cuts at 1024 bytes
  322.                  * so if websocket-frame is > 1024 bytes we have to wait until whole
  323.                  * data is transferd.
  324.                  */
  325.                 if(strlen($data) < $dataLength)
  326.                 {                      
  327.                         return false;
  328.                 }
  329.  
  330.                 if($isMasked === true)
  331.                 {
  332.                         for($i = $payloadOffset; $i < $dataLength; $i++)
  333.                         {
  334.                                 $j = $i - $payloadOffset;
  335.                                 if(isset($data[$i]))
  336.                                 {
  337.                                         $unmaskedPayload .= $data[$i] ^ $mask[$j % 4];
  338.                                 }
  339.                         }
  340.                         $decodedData['payload'] = $unmaskedPayload;
  341.                 }
  342.                 else
  343.                 {
  344.                         $payloadOffset = $payloadOffset - 4;
  345.                         $decodedData['payload'] = substr($data, $payloadOffset);
  346.                 }
  347.  
  348.                 return $decodedData;
  349.    }
  350. //////////////////////////////////////////////////////////////      
  351.    private function encode($payload, $type, $masked)//Кодирует сообщение перед отправкой пользователю
  352.    {
  353.        $frameHead = array();
  354.                 $frame = '';
  355.                 $payloadLength = strlen($payload);
  356.  
  357.                 switch($type)
  358.                 {              
  359.                         case 'text':
  360.                                 // first byte indicates FIN, Text-Frame (10000001):
  361.                                 $frameHead[0] = 129;                           
  362.                         break;                 
  363.  
  364.                         case 'close':
  365.                                 // first byte indicates FIN, Close Frame(10001000):
  366.                                 $frameHead[0] = 136;
  367.                         break;
  368.  
  369.                         case 'ping':
  370.                                 // first byte indicates FIN, Ping frame (10001001):
  371.                                 $frameHead[0] = 137;
  372.                         break;
  373.  
  374.                         case 'pong':
  375.                                 // first byte indicates FIN, Pong frame (10001010):
  376.                                 $frameHead[0] = 138;
  377.                         break;
  378.                 }
  379.  
  380.                 // set mask and payload length (using 1, 3 or 9 bytes)
  381.                 if($payloadLength > 65535)
  382.                 {
  383.                         $payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
  384.                         $frameHead[1] = ($masked === true) ? 255 : 127;
  385.                         for($i = 0; $i < 8; $i++)
  386.                         {
  387.                                 $frameHead[$i+2] = bindec($payloadLengthBin[$i]);
  388.                         }
  389.                         // most significant bit MUST be 0 (close connection if frame too big)
  390.                         if($frameHead[2] > 127)
  391.                         {
  392.                                 $this->close(1004);
  393.                                 return false;
  394.                         }
  395.                 }
  396.                 elseif($payloadLength > 125)
  397.                 {
  398.                         $payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
  399.                         $frameHead[1] = ($masked === true) ? 254 : 126;
  400.                         $frameHead[2] = bindec($payloadLengthBin[0]);
  401.                         $frameHead[3] = bindec($payloadLengthBin[1]);
  402.                 }
  403.                 else
  404.                 {
  405.                         $frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength;
  406.                 }
  407.  
  408.                 // convert frame-head to string:
  409.                 foreach(array_keys($frameHead) as $i)
  410.                 {
  411.                         $frameHead[$i] = chr($frameHead[$i]);
  412.                 }
  413.                 if($masked === true)
  414.                 {
  415.                         // generate a random mask:
  416.                         $mask = array();
  417.                         for($i = 0; $i < 4; $i++)
  418.                         {
  419.                                 $mask[$i] = chr(rand(0, 255));
  420.                         }
  421.  
  422.                         $frameHead = array_merge($frameHead, $mask);                   
  423.                 }                                              
  424.                 $frame = implode('', $frameHead);
  425.  
  426.                 // append payload to frame:
  427.                 $framePayload = array();       
  428.                 for($i = 0; $i < $payloadLength; $i++)
  429.                 {              
  430.                         $frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
  431.                 }
  432.  
  433.                 return $frame;
  434.    }
  435. }
  436.  
dvd2444 Отправлено: 16 Июля, 2014 - 17:32:41 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков

Ответов: 9
Просмотров: 546
OrmaJeverНу вот ява клиент
CODE (htmlphp):
скопировать код в буфер обмена
  1. package com.example.ws1;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.TextView;
  10.  
  11. import de.tavendo.autobahn.WebSocketConnection;
  12. import de.tavendo.autobahn.WebSocketException;
  13. import de.tavendo.autobahn.WebSocketHandler;
  14.  
  15. public class MainActivity extends Activity implements OnClickListener
  16. {
  17.  
  18.         Button but;
  19.         TextView textView2;
  20.         private static final String TAG = "myLogs";
  21.          
  22.         private final WebSocketConnection mConnection = new WebSocketConnection();
  23.        
  24.     @Override
  25.     protected void onCreate(Bundle savedInstanceState)
  26.     {
  27.         super.onCreate(savedInstanceState);
  28.         setContentView(R.layout.activity_main);
  29.        
  30.         textView2 = (TextView) findViewById(R.id.textView2);
  31.         but = (Button) findViewById(R.id.but);
  32.         but.setOnClickListener(this);
  33.        
  34.     }
  35.       public void onClick(View v)
  36.       {
  37.         switch (v.getId())
  38.         {
  39.         case R.id.but:
  40.        
  41.        
  42.         //final String mWsUrl = "ws://echo.websocket.org"; ws://ws:2223/server.php
  43.        
  44.         final String wsuri = "ws://ws:2223/server.php";
  45.        
  46.         try {
  47.                 textView2.setText("1111");
  48.            mConnection.connect(wsuri, new WebSocketHandler(){
  49.               @Override
  50.               public void onOpen()
  51.               {
  52.                  Log.d(TAG, "Status: Connected to " + wsuri);
  53.                  //mConnection.sendTextMessage("connect_i:qwe");
  54.                  textView2.setText("Status: Connected to " + wsuri);
  55.               }
  56.    
  57.               @Override
  58.               public void onTextMessage(String payload)
  59.               {
  60.                  Log.d(TAG, "Got echo: " + payload);
  61.                  textView2.setText("Got echo: " + payload);
  62.               }
  63.    
  64.               @Override
  65.               public void onClose(int code, String reason)
  66.               {
  67.                  Log.d(TAG, "Connection lost.");    
  68.                  textView2.setText("12222");
  69.               }
  70.            });
  71.         }
  72.         catch (WebSocketException e)
  73.         {  
  74.            Log.d(TAG, e.toString());
  75.         }
  76.        
  77.         break;  
  78.        
  79.         default:
  80.           break;
  81.         }
  82.       }
  83. }

Код сервера скидывать не хочется, ибо там около 500 строк.Но с рукопожатием на моем
сервере все в порядке
dvd2444 Отправлено: 16 Июля, 2014 - 17:27:21 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков

Ответов: 9
Просмотров: 546
OrmaJeverНа ява я не отправляю, но почему то при подключении к сайту http://www[dot]websocket[dot]org заголовки не требуются
dvd2444 Отправлено: 16 Июля, 2014 - 17:13:10 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков

Ответов: 9
Просмотров: 546
Есть сервер на веб сокетах, который отлично подключает клиентов на ява скрипте, но такой же клиент на яве не подключается, хотя если клиент на ява подключается по адресу(ws://echo.websocket.org) все работает хорошо, в чем может быть проблема?
dvd2444 Отправлено: 13 Июля, 2014 - 23:39:55 • Тема: обращение к работающему скрипту и получение данных у него • Форум: Вопросы новичков

Ответов: 0
Просмотров: 55
Есть скрипт который в бесконечном цикле, выводит какие то данные, можно ли получать эти данные с другого файла?
(Добавление)
Вопрос отпал.Реализовал прослушку через веб сокет
dvd2444 Отправлено: 09 Июля, 2014 - 15:09:48 • Тема: Веб сокеты • Форум: Вопросы новичков

Ответов: 33
Просмотров: 4396
Можете разъяснить некоторые моменты в коде?
PHP:
скопировать код в буфер обмена
  1. public function run()                   //Запуск сервера
  2.     {
  3.         $this->start(); //Функция создает  сокет
  4.        
  5.         $this->clients = array($this->socket); //создаю массив пользователей
  6.        
  7.         $null=null;
  8.         do
  9.         {
  10.             $read = $this->clients;
  11.             if (socket_select($read, $write = NULL, $except = NULL, 0) < 1) //ждем каких либо действий
  12.             {
  13.                 continue;
  14.             }
  15.            
  16.             if (in_array($this->socket, $read))
  17.             {
  18.                 $this->clients[] = $newsock = socket_accept($this->socket);//создаем новое подключение
  19.                 $data = socket_read($newsock, 1024);
  20.                
  21.                 $this->handshake($data,$newsock);//выполняем рукопожатие
  22.                
  23.                 $msg = $newsock." connected to the server";
  24.                 $this->send($msg);                               //отпраляем пользователям сообщение
  25.                
  26.                 $msg = "<hr>".$msg."<hr>";
  27.                 $this->console($msg);
  28.                
  29.                 $key = array_search($this->socket, $read);//Вот здесь появляется непонимание.Для чего удалять созданное подключение?
  30.                 unset($read[$key]);                                  //Если эти строки удалить, то подключение нескольких юзеров одновременно не возможно
  31.             }
  32.            
  33.             foreach ($read as $read_sock)// перебираем все подключения
  34.             {              
  35.                 $data = socket_read($read_sock, 1024);//считвываем сообщения от всех пользоателей
  36.            
  37.                 if ($data === false)   //если пользователь отключился вызываем фцию отключения
  38.                 {
  39.                     // remove client for $clients array
  40.                     $this->close($read_sock);
  41.                     continue;
  42.                 }
  43.                 else
  44.                 {                                
  45.                    
  46.                     $data = $this->decode($data);  
  47.                    
  48.                     if($data['payload']=='close')
  49.                     {                        
  50.                         $this->close($read_sock);
  51.                         continue;
  52.                     }
  53.                    
  54.                     $data['payload'] = $read_sock." Say: ".$data['payload'];
  55.                     $this->send($data['payload']);
  56.                     $this->console($data['payload']."<br />");      //отправляем сообщение пользователю
  57.                 }
  58.            
  59.             }
  60.         }while(true);

Еще есть проблема с тем, что когда я закрываю страницу браузера с активным подключением отключаются все пользователи и больше подключиться не удается(хотя сервер не останавливается)
dvd2444 Отправлено: 07 Июля, 2014 - 16:06:27 • Тема: Веб сокеты • Форум: Вопросы новичков

Ответов: 33
Просмотров: 4396
esterioСпасибо, понял.Но все же хотелось бы самому наступить на все грабли что бы понимание пришло, у меня так происходит обучение, пока свой велосипед не напишу с мертвой точки не сдвинусь Улыбка
dvd2444 Отправлено: 07 Июля, 2014 - 14:57:45 • Тема: Веб сокеты • Форум: Вопросы новичков

Ответов: 33
Просмотров: 4396
OrmaJeverВозможно он имеет в виду что я глупый дядька и пишу на коленке за 5 минут
(Добавление)
Всем спасибо за помощь, все заработало, вот рабочий код(может кому понадобится).Теперь буду углубляться.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. //header('Content-Type: text/plain;');
  3. error_reporting(E_ALL); //Выводим все ошибки и предупреждения
  4. set_time_limit(0);              //Время выполнения скрипта не ограничено
  5. ob_get_flush(); //Включаем вывод без буферизации
  6. ob_implicit_flush($flag=TRUE);
  7. $host = "websocket.ru";
  8. $port = 1233;
  9.  
  10. echo "-=SERVER v2.0=-<hr><br />";
  11.  
  12. echo "Socket create----";
  13. if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP))===false)
  14. {
  15.     echo "Error...".socket_strerror(socket_last_error())."<br />";
  16.     //exit();
  17. }
  18. else
  19. {
  20.     echo "OK<br />";
  21. }
  22.  
  23. echo "Socket bind------";
  24. //привязываем его к указанным ip и порту
  25. if((socket_bind($socket, $host, $port))===false)
  26. {
  27.     echo "Error...".socket_strerror(socket_last_error())."<br />\r\n";
  28.     //exit();
  29. }
  30. else
  31. {
  32.     echo "OK <br />\r\n";
  33. }
  34.  
  35. socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 20);//разрешаем использовать один порт для нескольких соединений
  36.  
  37. echo "Socket listening--";
  38. if(($listen = socket_listen($socket))===false)
  39. {
  40.     echo "Error...".socket_strerror(socket_last_error())."<br />\r\n";
  41.     exit();
  42. }
  43. else
  44. {
  45.     echo "OK <br />\r\n<hr>";
  46. }
  47. while(true)
  48. {
  49.     echo "Client connected--";  
  50.    
  51.     $accept = socket_accept($socket);                   //Ждем подключения
  52.     if($accept === false)
  53.     {
  54.         echo "err: ".socket_strerror(socket_last_error())."<br />";        
  55.     }
  56.     else
  57.     {
  58.         echo "OK <br />";
  59.     }
  60.    
  61.     $msg =socket_read($accept, 1024);                  //считываем заголовки
  62.    
  63.     perform_handshaking($msg,$accept);                 //производим рукопожатие
  64.     echo"Headers sends----OK<br />";    
  65.    
  66.     do
  67.     {
  68.         if(($data = socket_read($accept, 2048))===false)
  69.         {
  70.             echo "err: ".socket_strerror(socket_last_error())."<br />";
  71.         }
  72.         else
  73.         {
  74.             echo "Read socket---OK";
  75.         }
  76.         $data = hybi10Decode($data);
  77.         $data = hybi10Encode($data['payload']);
  78.        
  79.         socket_write($accept,$data,strlen($data));
  80.         break 2;
  81.     }
  82.     while (true);
  83. }
  84.  
  85. close($socket);
  86.  
  87. /////       /////         ///////
  88.  
  89. function close($socket)
  90. {
  91.     if (isset($socket))
  92.     {
  93.         echo "<br /><hr>Close connection--";
  94.         socket_close($socket);
  95.         echo "OK <br />";
  96.     }    
  97. }
  98.  
  99.  
  100.  
  101. function perform_handshaking($receved_header,$client_conn)
  102. {
  103.         $headers = array();
  104.         $lines = preg_split("/\r\n/", $receved_header);
  105.         foreach($lines as $line)
  106.         {
  107.                 $line = chop($line);
  108.                 if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
  109.                 {
  110.                         $headers[$matches[1]] = $matches[2];
  111.                 }
  112.         }
  113.  
  114.         $secKey = $headers['Sec-WebSocket-Key'];
  115.         $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
  116.         //hand shaking header
  117.         $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
  118.         "Upgrade: websocket\r\n" .
  119.         "Connection: Upgrade\r\n" .
  120.         "Sec-WebSocket-Origin: http://websocket.ru\r\n" .
  121.         "Sec-WebSocket-Location: ws://websocket.ru:1233\r\n".
  122.         "Sec-WebSocket-Accept: $secAccept\r\n\r\n";
  123.         socket_write($client_conn,$upgrade,strlen($upgrade));
  124. }
  125.  
  126.         function hybi10Encode($payload, $type = 'text', $masked = false)
  127.         {
  128.                 $frameHead = array();
  129.                 $frame = '';
  130.                 $payloadLength = strlen($payload);
  131.  
  132.                 switch($type)
  133.                 {              
  134.                         case 'text':
  135.                                 // first byte indicates FIN, Text-Frame (10000001):
  136.                                 $frameHead[0] = 129;                           
  137.                         break;                 
  138.  
  139.                         case 'close':
  140.                                 // first byte indicates FIN, Close Frame(10001000):
  141.                                 $frameHead[0] = 136;
  142.                         break;
  143.  
  144.                         case 'ping':
  145.                                 // first byte indicates FIN, Ping frame (10001001):
  146.                                 $frameHead[0] = 137;
  147.                         break;
  148.  
  149.                         case 'pong':
  150.                                 // first byte indicates FIN, Pong frame (10001010):
  151.                                 $frameHead[0] = 138;
  152.                         break;
  153.                 }
  154.  
  155.                 // set mask and payload length (using 1, 3 or 9 bytes)
  156.                 if($payloadLength > 65535)
  157.                 {
  158.                         $payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
  159.                         $frameHead[1] = ($masked === true) ? 255 : 127;
  160.                         for($i = 0; $i < 8; $i++)
  161.                         {
  162.                                 $frameHead[$i+2] = bindec($payloadLengthBin[$i]);
  163.                         }
  164.                         // most significant bit MUST be 0 (close connection if frame too big)
  165.                         if($frameHead[2] > 127)
  166.                         {
  167.                                 $this->close(1004);
  168.                                 return false;
  169.                         }
  170.                 }
  171.                 elseif($payloadLength > 125)
  172.                 {
  173.                         $payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
  174.                         $frameHead[1] = ($masked === true) ? 254 : 126;
  175.                         $frameHead[2] = bindec($payloadLengthBin[0]);
  176.                         $frameHead[3] = bindec($payloadLengthBin[1]);
  177.                 }
  178.                 else
  179.                 {
  180.                         $frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength;
  181.                 }
  182.  
  183.                 // convert frame-head to string:
  184.                 foreach(array_keys($frameHead) as $i)
  185.                 {
  186.                         $frameHead[$i] = chr($frameHead[$i]);
  187.                 }
  188.                 if($masked === true)
  189.                 {
  190.                         // generate a random mask:
  191.                         $mask = array();
  192.                         for($i = 0; $i < 4; $i++)
  193.                         {
  194.                                 $mask[$i] = chr(rand(0, 255));
  195.                         }
  196.  
  197.                         $frameHead = array_merge($frameHead, $mask);                   
  198.                 }                                              
  199.                 $frame = implode('', $frameHead);
  200.  
  201.                 // append payload to frame:
  202.                 $framePayload = array();       
  203.                 for($i = 0; $i < $payloadLength; $i++)
  204.                 {              
  205.                         $frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
  206.                 }
  207.  
  208.                 return $frame;
  209.         }
  210.  
  211.         function hybi10Decode($data)
  212.         {
  213.                 $payloadLength = '';
  214.                 $mask = '';
  215.                 $unmaskedPayload = '';
  216.                 $decodedData = array();
  217.  
  218.                 // estimate frame type:
  219.                 $firstByteBinary = sprintf('%08b', ord($data[0]));             
  220.                 $secondByteBinary = sprintf('%08b', ord($data[1]));
  221.                 $opcode = bindec(substr($firstByteBinary, 4, 4));
  222.                 $isMasked = ($secondByteBinary[0] == '1') ? true : false;
  223.                 $payloadLength = ord($data[1]) & 127;
  224.  
  225.                 // close connection if unmasked frame is received:
  226.                 if($isMasked === false)
  227.                 {
  228.                         $this->close(1002);
  229.                 }
  230.  
  231.                 switch($opcode)
  232.                 {
  233.                         // text frame:
  234.                         case 1:
  235.                                 $decodedData['type'] = 'text';                         
  236.                         break;
  237.  
  238.                         case 2:
  239.                                 $decodedData['type'] = 'binary';
  240.                         break;
  241.  
  242.                         // connection close frame:
  243.                         case 8:
  244.                                 $decodedData['type'] = 'close';
  245.                         break;
  246.  
  247.                         // ping frame:
  248.                         case 9:
  249.                                 $decodedData['type'] = 'ping';                         
  250.                         break;
  251.  
  252.                         // pong frame:
  253.                         case 10:
  254.                                 $decodedData['type'] = 'pong';
  255.                         break;
  256.  
  257.                         default:
  258.                                 // Close connection on unknown opcode:
  259.                                 $this->close(1003);
  260.                         break;
  261.                 }
  262.  
  263.                 if($payloadLength === 126)
  264.                 {
  265.                    $mask = substr($data, 4, 4);
  266.                    $payloadOffset = 8;
  267.                    $dataLength = bindec(sprintf('%08b', ord($data[2])) . sprintf('%08b', ord($data[3]))) + $payloadOffset;
  268.                 }
  269.                 elseif($payloadLength === 127)
  270.                 {
  271.                         $mask = substr($data, 10, 4);
  272.                         $payloadOffset = 14;
  273.                         $tmp = '';
  274.                         for($i = 0; $i < 8; $i++)
  275.                         {
  276.                                 $tmp .= sprintf('%08b', ord($data[$i+2]));
  277.                         }
  278.                         $dataLength = bindec($tmp) + $payloadOffset;
  279.                         unset($tmp);
  280.                 }
  281.                 else
  282.                 {
  283.                         $mask = substr($data, 2, 4);   
  284.                         $payloadOffset = 6;
  285.                         $dataLength = $payloadLength + $payloadOffset;
  286.                 }
  287.  
  288.                 /**
  289.                  * We have to check for large frames here. socket_recv cuts at 1024 bytes
  290.                  * so if websocket-frame is > 1024 bytes we have to wait until whole
  291.                  * data is transferd.
  292.                  */
  293.                 if(strlen($data) < $dataLength)
  294.                 {                      
  295.                         return false;
  296.                 }
  297.  
  298.                 if($isMasked === true)
  299.                 {
  300.                         for($i = $payloadOffset; $i < $dataLength; $i++)
  301.                         {
  302.                                 $j = $i - $payloadOffset;
  303.                                 if(isset($data[$i]))
  304.                                 {
  305.                                         $unmaskedPayload .= $data[$i] ^ $mask[$j % 4];
  306.                                 }
  307.                         }
  308.                         $decodedData['payload'] = $unmaskedPayload;
  309.                 }
  310.                 else
  311.                 {
  312.                         $payloadOffset = $payloadOffset - 4;
  313.                         $decodedData['payload'] = substr($data, $payloadOffset);
  314.                 }
  315.  
  316.                 return $decodedData;
  317.         }

И клиент
CODE (htmlphp):
скопировать код в буфер обмена
  1. &#65279;<!DOCTYPE html>
  2. <!--
  3. To change this license header, choose License Headers in Project Properties.
  4. To change this template file, choose Tools | Templates
  5. and open the template in the editor.
  6. -->
  7. <html>
  8.     <head>
  9.         <title>Client</title>
  10.         <meta charset="UTF-8">
  11.         <meta name="viewport" content="width=device-width, initial-scale=1.0">
  12.         <style type="text/css">
  13. html,body {
  14.         font:normal 0.9em arial,helvetica;
  15. }
  16. #log {
  17.         width:400px;
  18.         height:350px;
  19.         border:1px solid #7F9DB9;
  20.         overflow:auto;
  21. }
  22. #msg {
  23.         width:400px;
  24. }
  25. </style>
  26. <script type="text/javascript">
  27. var socket;
  28.  
  29. function init() {
  30.         var host = 'ws://websocket.ru:1233/server.php'; // 'ws://echo.websocket.org'
  31.         try {
  32.                 socket = new WebSocket(host);
  33.                 log('WebSocket - status '+socket.readyState);
  34.                 socket.onopen    = function(msg) {
  35.                                                            log("Welcome - status "+this.readyState);
  36.                                                    };
  37.                 socket.onmessage = function(msg) {
  38.                                                            log("Received: "+msg.data);
  39.                                                    };
  40.                 socket.onclose   = function(msg) {
  41.                                                            log("Disconnected - status "+this.readyState);
  42.                                                    };
  43.         }
  44.         catch(ex){
  45.                 log(ex);
  46.         }
  47.         $("msg").focus();
  48. }
  49.  
  50. function send(){
  51.         var txt,msg;
  52.         txt = $("msg");
  53.         msg = txt.value;
  54.         if(!msg) {
  55.                 alert("Message can not be empty");
  56.                 return;
  57.         }
  58.         txt.value="";
  59.         txt.focus();
  60.         try {
  61.                 socket.send(msg);
  62.                 log('Sent: '+msg);
  63.         } catch(ex) {
  64.                 log(ex);
  65.         }
  66. }
  67. function quit(){
  68.         if (socket != null) {
  69.                 log("Goodbye!");
  70.                 socket.close();
  71.                 socket=null;
  72.         }
  73. }
  74.  
  75. function reconnect() {
  76.         quit();
  77.         init();
  78. }
  79.  
  80. // Utilities
  81. function $(id){ return document.getElementById(id); }
  82. function log(msg){ $("log").innerHTML+="<br>"+msg; }
  83. function onkey(event){ if(event.keyCode==13){ send(); } }
  84. </script>
  85. </head>
  86. <body onload="init()">
  87. <h3>WebSocket v1.0</h3>
  88. <div id="log"></div>
  89. <input id="msg" type="text" onkeypress="onkey(event)"/>
  90. <button onclick="send()">Send</button>
  91. <button onclick="quit()">Quit</button>
  92. <button onclick="reconnect()">Reconnect</button>
  93. </body>
  94. </html>

Страниц (2): [1] 2 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB