2016-08-20 158 views
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); 
?> 

這是關於服務器的示例代碼。檢查PHP套接字服務器中的斷開連接客戶端

當我測試這個代碼時,有一個問題。如果客戶端關閉程序與out發送「退出」客戶端不能再次連接,我殺死服務器進程並重新啓動;之後,客戶端可以再次連接。

我想保留一些關於以前連接的數據。

如何檢查斷開客戶端?

然後,如何刪除有關斷開客戶端的數據?

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

我想做的代碼和添加像這樣,但我沒有任何PHP函數的套接字。

回答

1

如何檢查斷開客戶端?

  if ($input == null) { 

你只是忘了之前

   unset($client[$i]); 

還插入

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

,或者你可能要合併

你這一行已經做此檢查

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

然後,如何刪除有關斷開客戶端的數據?

除了你有以上unset($client[$i])

$read = Array($sock); 

取代

$read[0] = $sock; 

以清除來自前一循環的數組元素。

相關問題