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 :: Веб сокеты [2]

 PHP.SU

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


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

> Без описания
dvd2444
Отправлено: 07 Июля, 2014 - 14:57:45
Post Id


Новичок


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


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




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>
 
 Top
esterio
Отправлено: 07 Июля, 2014 - 16:01:51
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




dvd2444
Нет не это я имел ввиду. Я говорю про то что там все нюансы обкатаны и работают без сбоев в работе. А также то что писали эго далеко не глупые люди. Но должен согласиться дешевый хостинг не подойдет. Но и с другой стороны как зациклить PHP скрипт на дешевом хостинге без краша по таймауту. насколько я помню там нельзя поставить timelimit 0. Так что в любом случае такые вещи на хостингах не стоят
 
 Top
dvd2444
Отправлено: 07 Июля, 2014 - 16:06:27
Post Id


Новичок


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


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




esterioСпасибо, понял.Но все же хотелось бы самому наступить на все грабли что бы понимание пришло, у меня так происходит обучение, пока свой велосипед не напишу с мертвой точки не сдвинусь Улыбка
 
 Top
Panoptik
Отправлено: 07 Июля, 2014 - 16:06:30
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




слай скрипт не имеет ограничения по времени


-----
Just do it
 
 Top
Zuldek
Отправлено: 08 Июля, 2014 - 15:01:33
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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




K socket.io придут когда откроют что веб-сокеты не работают в половине браузеров Улыбка

(Отредактировано автором: 08 Июля, 2014 - 15:02:00)

 
 Top
esterio
Отправлено: 08 Июля, 2014 - 15:24:52
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




Zuldek
dvd2444 пишет:
Но все же хотелось бы самому наступить на все грабли что бы понимание пришло

В даном случае соглашусь с ТС
 
 Top
LIME
Отправлено: 08 Июля, 2014 - 15:31:49
Post Id


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


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


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




а кто-то пытается сокет-сервер на хостинге поднять? веселенькое должно быть занятие)) как и пользование))
(Добавление)
че за фигня)) куда сообщение дели))
(Добавление)
аа...эт я предыдущую страницу коментирую)
тоже весело)
 
 Top
Panoptik
Отправлено: 08 Июля, 2014 - 16:09:42
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




никаких проблем поднять сокет сервер нет даже на унылом хостинге. главное чтобы там был пхп с поддержкой сокетов


-----
Just do it
 
 Top
esterio
Отправлено: 08 Июля, 2014 - 18:45:13
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




Panoptik
esterio пишет:
веселенькое должно быть занятие))

Zuldek пишет:
K socket.io придут когда откроют что веб-сокеты не работают в половине браузеров

добавить больше нечего. поднять то можно. но цена (время и усилия) слишком большие.
 
 Top
LIME
Отправлено: 08 Июля, 2014 - 19:07:06
Post Id


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


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


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




не знаю какие проблемы но смысла никакого
если уж нужны проекту сокеты значит нужен vps
 
 Top
OrmaJever Модератор
Отправлено: 08 Июля, 2014 - 19:48:08
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Panoptik пишет:
никаких проблем поднять сокет сервер нет даже на унылом хостинге. главное чтобы там был пхп с поддержкой сокетов

ну и как там твои движения в этом направлении?))


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
LIME
Отправлено: 08 Июля, 2014 - 20:37:43
Post Id


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


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


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




мне тоже интересно что за пхп с поддержкой сокетов
такое есть? 1
на хостингах? 2

(Отредактировано автором: 08 Июля, 2014 - 20:38:26)

 
 Top
OrmaJever Модератор
Отправлено: 08 Июля, 2014 - 22:56:05
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




LIME ну типа семейство socket_*, хотя я не представляю где эти функции могут не работать Растерялся


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
LIME
Отправлено: 08 Июля, 2014 - 23:05:51
Post Id


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


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


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




а я не представляю как ими вебсокеты поддерживать
я думал че поумнее будет
 
 Top
OrmaJever Модератор
Отправлено: 08 Июля, 2014 - 23:33:31
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Так же как и на Си только в одном потоке Ха-ха


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB