【问题标题】:Check disconnect clients in PHP socket server检查 PHP 套接字服务器中的断开客户端
【发布时间】:2016-12-27 11:37:35
【问题描述】:
#!/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函数。

【问题讨论】:

    标签: php sockets server


    【解决方案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);
    

    从上一个循环周期中清除数组元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多