[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сокет-сервер пропускает сообщения
sasha281215
Здравствуйте, имеется сервер. Возникает проблема, иногда клиент отправляет несколько сообщений подряд и сервер не успевает их поймать, как можно исправить?
Например, клиент отправляет число 32, затем 58. Но сервер получает только 32.
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$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);
?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.