检查PHP套接字服务器

时间:2016-08-20 11:48:12

标签: php sockets 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函数。

1 个答案:

答案 0 :(得分: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);

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