Здравствуйте, имеется сервер. Возникает проблема, иногда клиент отправляет несколько сообщений подряд и сервер не успевает их поймать, как можно исправить? Например, клиент отправляет число 32, затем 58. Но сервер получает только 32. Код (Text): <?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); $address = 'localhost'; //Адрес работы сервера $port = 7777; socket_bind($socket, $address, $port); socket_listen($socket); socket_set_nonblock($socket); // отключает блокирование при чтении сокета $clients[] = $socket; $members = array(); echo "\n\n\n"; while(true){ sleep(1); $read = $clients; if(socket_select($read, $write = NULL, $except = NULL, 0) < 1) { echo '.'; continue; } echo "\n---------------------\n"; //print_r($read); echo "\n"; //print_r($clients); echo "\n"; if(in_array($socket, $read)) { $new_socket = socket_accept($socket); socket_getpeername($new_socket, $client_ip); // Шаг 1. отдать полиси if(!$members[$client_ip]) { $members[$client_ip] = 'new'; $data = socket_read($new_socket, 1024, PHP_BINARY_READ); if(trim($data) == '<policy-file-request/>') { echo "send policy...\n"; $msg = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"7777\" /></cross-domain-policy>\0"; // Crossdomain socket_write($new_socket, $msg, strlen($msg)); socket_close($new_socket); } } elseif($members[$client_ip] == 'new') { // Шаг 2. добавить пользователя в список подключенных $clients[] = $new_socket; $members[$client_ip] = 'client'; echo "+ New client: $client_ip, all: ".(count($clients) - 1)."\n"; //print_r($clients); echo "\n"; } unset($read[array_search($socket, $read)]); } //print_r($read); echo "\n"; foreach($read as $v) { $data = socket_read($v, 2048, PHP_BINARY_READ); // Если клиент послал сообщение if($data) { echo "Data ".$code."\n"; } elseif(!trim($data)) { // Если клиент отключился socket_getpeername($v, $client_ip); unset($members[$client_ip]); unset($clients[array_search($v, $clients)]); socket_close($v); echo "< ".$client_ip.": client disconnected. All: ".(count($clients) - 1)."\n"; } } } // Закрыть сокет socket_close($socket); ?>
работаешь с сокетами - у тебя есть все инструменты, чтобы не посылать сообщения "в глухую". Отослал сообщение на клиенте - требуй принятия этого сообщения от сервера. Если сервер не ответил - посылай сообщение ещё раз