Например, клиент отправляет число 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);
?>