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 :: Web Sockets ява и рнр

 PHP.SU

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


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

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


Новичок


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


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




Есть сервер на веб сокетах, который отлично подключает клиентов на ява скрипте, но такой же клиент на яве не подключается, хотя если клиент на ява подключается по адресу(ws://echo.websocket.org) все работает хорошо, в чем может быть проблема?
 
 Top
OrmaJever Модератор
Отправлено: 16 Июля, 2014 - 17:24:15
Post Id



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


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


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




для подключения по протоколу веб сокетов нужно отправить определённые заголовки серверу, javascript делает это сам, а на java вы это делаете?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
dvd2444
Отправлено: 16 Июля, 2014 - 17:27:21
Post Id


Новичок


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


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




OrmaJeverНа ява я не отправляю, но почему то при подключении к сайту http://www[dot]websocket[dot]org заголовки не требуются
 
 Top
OrmaJever Модератор
Отправлено: 16 Июля, 2014 - 17:29:59
Post Id



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


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


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




ну блин, значит это от реализации сервера зависит. Хотя от всего это может зависеть, тут без кода обеих сторон говорить нечего.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
dvd2444
Отправлено: 16 Июля, 2014 - 17:32:41
Post Id


Новичок


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


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




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 строк.Но с рукопожатием на моем
сервере все в порядке
 
 Top
OrmaJever Модератор
Отправлено: 16 Июля, 2014 - 20:19:37
Post Id



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


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


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




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


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
dvd2444
Отправлено: 16 Июля, 2014 - 21:15:54
Post Id


Новичок


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


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




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


Новичок


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


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




Ну так что, есть идеи?
 
 Top
dvd2444
Отправлено: 17 Июля, 2014 - 21:32:55
Post Id


Новичок


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


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




Может ли моя проблема быть связанна с тем что сервер находится на локальной машине?
И как можно проверить была ли попытка в принципе подключиться к серверу?
 
 Top
dvd2444
Отправлено: 21 Июля, 2014 - 19:08:30
Post Id


Новичок


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


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




Решением было разместить сервер в интернете.Похоже ява все равно что у вас в файле хост какой то урл переопределен. Нужно покупать впс сервер или хостинг где поддерживается бесконечное исполнение скрипта.
 
 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