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

Dies ist Beispielcode über Server.Überprüfen Sie die Verbindung von Clients in PHP-Socket-Server

Wenn ich diesen Code testen, habe ein Problem. Wenn Client schließen Programm mit aus senden "Exit" -Client kann nicht wieder so verbinden, ich kill Server-Prozess und neu starten; Danach kann der Client erneut eine Verbindung herstellen.

Ich denke, bleiben einige Daten über vorherige Verbindung.

Wie überprüfen Sie die Verbindung mit Clients?

Und dann, wie Sie Daten über trennen Clients entfernen?

Ich möchte Code und fügen Sie so, aber ich habe keine PHP-Funktion der Steckdose.

Antwort

1

Wie überprüfen Sie die Verbindung mit den Clients?

Sie haben diese Prüfung bereits mit dieser Zeile:

  if ($input == null) { 

Sie haben soeben auch

einfügen vergessen zu
   socket_close($client[$i]['sock']); 

vor

   unset($client[$i]); 

oder Sie könnten

kombinieren möchten

Und dann, wie Daten über trennen Clients entfernen?

Zusätzlich zu dem oben unset($client[$i]) Sie

$read[0] = $sock; 

mit

$read = Array($sock); 

löschen Array-Elemente von dem vorhergehenden Schleifenzyklus zu ersetzen.

Verwandte Themen