За последние 24 часа нас посетили 21667 программистов и 1033 робота. Сейчас ищут 710 программистов ...

Сервер пропускает сообщения

Тема в разделе "PHP для новичков", создана пользователем Sasha55555, 25 мар 2019.

  1. Sasha55555

    Sasha55555 Новичок

    С нами с:
    18 мар 2018
    Сообщения:
    152
    Симпатии:
    0
    Здравствуйте, имеется сервер. Возникает проблема, иногда клиент отправляет несколько сообщений подряд и сервер не успевает их поймать, как можно исправить?
    Например, клиент отправляет число 32, затем 58. Но сервер получает только 32.
    Код (Text):
    1. <?php
    2.     $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    3.     socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
    4.     $address = 'localhost'; //Адрес работы сервера
    5.     $port = 7777;
    6.     socket_bind($socket, $address, $port);
    7.     socket_listen($socket);
    8.     socket_set_nonblock($socket); // отключает блокирование при чтении сокета
    9.     $clients[] = $socket;
    10.     $members = array();
    11.  
    12.     echo "\n\n\n";
    13.  
    14.     while(true){
    15.         sleep(1);
    16.  
    17.         $read = $clients;
    18.  
    19.         if(socket_select($read, $write = NULL, $except = NULL, 0) < 1)
    20.         {
    21.             echo '.';
    22.             continue;
    23.         }
    24.  
    25.         echo "\n---------------------\n";
    26.         //print_r($read); echo "\n";
    27.         //print_r($clients); echo "\n";
    28.  
    29.  
    30.         if(in_array($socket, $read))
    31.         {
    32.             $new_socket = socket_accept($socket);
    33.             socket_getpeername($new_socket, $client_ip);
    34.      
    35.             // Шаг 1. отдать полиси
    36.             if(!$members[$client_ip])
    37.             {
    38.                 $members[$client_ip] = 'new';
    39.        
    40.                 $data = socket_read($new_socket, 1024, PHP_BINARY_READ);
    41.                 if(trim($data) == '<policy-file-request/>')
    42.                 {
    43.                     echo "send policy...\n";
    44.                     $msg = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"7777\" /></cross-domain-policy>\0"; // Crossdomain
    45.                     socket_write($new_socket, $msg, strlen($msg));
    46.                     socket_close($new_socket);
    47.                 }
    48.             } elseif($members[$client_ip] == 'new') { // Шаг 2. добавить пользователя в список подключенных
    49.                 $clients[] = $new_socket;
    50.                 $members[$client_ip] = 'client';
    51.                 echo "+ New client: $client_ip, all: ".(count($clients) - 1)."\n";
    52.                 //print_r($clients); echo "\n";
    53.             }
    54.             unset($read[array_search($socket, $read)]);
    55.         }
    56.  
    57.         //print_r($read); echo "\n";
    58.  
    59.         foreach($read as $v)
    60.         {
    61.             $data = socket_read($v, 2048, PHP_BINARY_READ);
    62.        
    63.             // Если клиент послал сообщение
    64.             if($data)
    65.             {
    66.                 echo "Data ".$code."\n";
    67.            
    68.             } elseif(!trim($data)) { // Если клиент отключился
    69.                 socket_getpeername($v, $client_ip);
    70.                 unset($members[$client_ip]);
    71.                 unset($clients[array_search($v, $clients)]);
    72.                 socket_close($v);
    73.                 echo "< ".$client_ip.": client disconnected. All: ".(count($clients) - 1)."\n";
    74.             }
    75.         }
    76.     }
    77.  
    78.         // Закрыть сокет
    79.         socket_close($socket);
    80. ?>
     
  2. Sasha55555

    Sasha55555 Новичок

    С нами с:
    18 мар 2018
    Сообщения:
    152
    Симпатии:
    0
  3. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    работаешь с сокетами - у тебя есть все инструменты, чтобы не посылать сообщения "в глухую". Отослал сообщение на клиенте - требуй принятия этого сообщения от сервера. Если сервер не ответил - посылай сообщение ещё раз