检查PHP套接字服务器中的断开客户端连接


Check disconnect clients in PHP socket server

#!/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
    }
}

我想让代码和添加像这样,但我没有socket的php函数。

如何检查断开的客户端?

您已经用这一行做了检查:

            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);