Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Работа кода на локальном компьютере и на хостинге

 PHP.SU

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


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

> Без описания
dvd2444
Отправлено: 24 Июля, 2014 - 17:42:00
Post Id


Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Есть код который отлично работает на локалхосте, но при переносе его на сервер криво стали работать некоторые функции связанные с веб сокетами(при выходе одного пользователя отключаются все соединения пользователей). Конфигурация рнр на сервере такая же как и на хостинге. Что может влиять на работу кода?
 
 Top
DeepVarvar Супермодератор
Отправлено: 24 Июля, 2014 - 20:37:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Data not enough! Please repeat your question with more information
 
 Top
dvd2444
Отправлено: 25 Июля, 2014 - 12:47:36
Post Id


Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




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.  
 
 Top
dvd2444
Отправлено: 25 Июля, 2014 - 16:39:38
Post Id


Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Если после 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 раза, что это за ерунда такая, не могу понять почему в первом варианте не работает
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB