Проверьте отключение клиентов в PHP-сервере

php sockets server

759 просмотра

1 ответ

#!/usr/local/bin/php -q 
<?

set_time_limit (0); 

$address = '192.168.0.201';
$port = 1077;

$max_clients = 10; 

$clients = Array(); 

$sock = socket_create(AF_INET, SOCK_STREAM, 0); 

socket_bind($sock, $address, $port) or die('fail.'); 

socket_listen($sock); 

while (true) { 
    $read[0] = $sock; 
    for ($i = 0; $i < $max_clients; $i++) 
    { 
        if ($client[$i]['sock']  != null) 
            $read[$i + 1] = $client[$i]['sock'] ; 
    } 
    $write=NULL;
    $exceptions=NULL;
    $ready = socket_select($read,$write,$exceptions,null); 

    if (in_array($sock, $read)) {
        for ($i = 0; $i < $max_clients; $i++) 
        {
            if ($client[$i]['sock'] == null) { 
                $client[$i]['sock'] = socket_accept($sock); 
                break; 
            } 
            elseif ($i == $max_clients - 1) 
                print ("many clients");
        }
        if (--$ready <= 0) 
            continue; 
    }

    for ($i = 0; $i < $max_clients; $i++)
    { 
        if (in_array($client[$i]['sock'] , $read)) 
        {
            $input = socket_read($client[$i]['sock'] , 1024); 
            if ($input == null) { 
                unset($client[$i]); 
            } 
            $n = trim($input); 
            if ($input == 'exit') { 
                socket_close($client[$i]['sock']); 
            } elseif ($input) {

                $host = 'localhost';
                $uname = 'root';
                $pwd = 'taek0526';
                $db = 'InputTest';

                $con = mysql_connect($host,$uname,$pwd) or die("connection failed");
                mysql_select_db($db,$con) or die("db selection failed");
                mysql_query("set names utf8");

                $data = explode(" ", $input);

                mysql_query("INSERT INTO `test`(`data1`, `data2`) VALUES ('".$data[0]."', '".$data[1]."')");

                mysql_close($con);

            } 
        } else { 
        } 
    } 
}
socket_close($sock); 
?> 

Это пример кода о сервере.

Когда я тестирую этот код, возникают проблемы. Если программа закрытия клиента без отправки «выходной» клиент не может подключиться снова, я прекращаю процесс сервера и перезагружаюсь; После этого клиент может подключиться снова.

Я думаю, что остаются некоторые данные о предыдущем подключении.

Как проверить отключение клиентов?

А потом, как удалить данные об отключении клиентов?

for ($i = 0; $i < $max_clients; $i++) {
    if( Check disconnect ){
        disconnect work
    }
}

Я хочу сделать код и добавить, как это, но у меня нет функции php сокета.

Автор: Justin Источник Размещён: 08.11.2019 11:15

Ответы (1)


1 плюс

Решение

Как проверить отключение клиентов?

Вы сделали эту проверку уже с этой строкой:

            if ($input == null) { 

Вы просто забыли также вставить

                socket_close($client[$i]['sock']);

до

                unset($client[$i]); 

или вы можете захотеть объединить

            if ($input == null or trim($input) == 'exit')
            {
                socket_close($client[$i]['sock']);
                unset($client[$i]);

А потом, как удалить данные об отключении клиентов?

В дополнение к вышесказанному unset($client[$i])вы должны заменить

    $read[0] = $sock; 

с участием

    $read = Array($sock);

очистить элементы массива из предыдущего цикла цикла.

Автор: Armali Размещён: 23.08.2016 09:51
Вопросы из категории :
32x32