簡體   English   中英

php socket server 檢查客戶端是否連接

[英]php socket server check client is connected or not

這個套接字服務器工作正常,但不明白如何檢查客戶端是否仍然連接,如果沒有關閉連接,任何機構都可以幫助檢查客戶端是否仍然連接,如果沒有如何關閉該連接

謝謝

<?php
  // PHP SOCKET SERVER

 // Configuration variables
  $host = "127.0.0.1";
  $port = 3000;
  $max = 5000;
  $client = array();

  // No timeouts, flush content immediatly
  @set_time_limit(0);
  ob_implicit_flush();

  // Server functions
    // Create socket
  $sock = @socket_create(AF_INET, SOCK_STREAM, 0) or die("[" . date('Y-m-d H:i:s') . "] Could not create socket\n");
  // Bind to socket
  socket_bind($sock, $host, $port) or die("[" . date('Y-m-d H:i:s') . "] Could not bind to socket\n");
  // Start listening
  socket_listen($sock) or die("[" . date('Y-m-d H:i:s') . "] Could not set up socket listener\n");

  rLog("Server started at " . $host . ":" . $port);
  // Server loop
  while (true) {
      socket_set_block($sock);
      // Setup clients listen socket for reading
      $read[0] = $sock;
      for ($i = 0; $i < $max; $i++) {
          if (@$client[$i]['sock'] != null)
              $read[$i + 1] = $client[$i]['sock'];
      }
      // Set up a blocking call to socket_select()
      $ready = socket_select($read, $write = null, $except = null, $tv_sec = null);
      // If a new connection is being made add it to the clients array
      if (in_array($sock, $read)) {
          for ($i = 0; $i < $max; $i++) {
              if (@$client[$i]['sock'] == null) {
                  if (($client[$i]['sock'] = socket_accept($sock)) < 0) {
                      rLog("socket_accept() failed: " . socket_strerror($client[$i]['sock']));
                  } else {

                      rLog("Client #" . $i . " connected");
                  }
                  break;
              } elseif ($i == $max - 1) {
                  rLog("Too many clients");
              }
          }
          if (--$ready <= 0)
              continue;
      }
      for ($i = 0; $i < $max; $i++) {
          if (in_array(@$client[$i]['sock'], $read)) {
              $input = socket_read($client[$i]['sock'], 1024);
              $n = trim($input);
              if ($input) {
                  // Strip whitespaces and write back to user
                  // Respond to commands
                  /*$output = ereg_replace("[ \t\n\r]","",$input).chr(0);
                   socket_write($client[$i]['sock'],$output);*/

                   $processRe = processRequest($input);
                    sendMessage($client[$i]['sock'],$processRe);

              }
          } else {

              //if($client[$i]['sock']!=null){
              // Close the socket
              //socket_close($client[$i]['sock']);
              //unset($client[$i]);
              //rLog("Disconnected(1) client #".$i);
              //}
          }
      }
  }
 socket_close($sock);
?>

當客戶端關閉連接時,將返回socket_select函數,並且當您調用socket_read時, socket_read可以使用指定的客戶端套接字句柄,您將獲得FALSE ,這意味着客戶端關閉連接。

但是當客戶端連接時,您可以通過在他的客戶端套接字句柄上socket_close function 來關閉連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM