允许客户端的多个连接

时间:2014-07-24 05:32:35

标签: php sockets stream pthreads

我遇到问题我无法连接我的socket中的所有客户端。只有在连接新连接时才连接一个客户端。我可以让所有客户端一起发送数据或连接所有客户端。我希望有人可以帮助我。

提前谢谢。

// Set time limit to indefinite execution
set_time_limit (0);
// Set the ip and port we will listen on
$address = '192.168.0.11';//server ip demo only.
$port = 123;
$max_clients = 10;
// Array that will hold client information
$client = array();
// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// Bind the socket to an address/port
socket_bind($sock, $address, $port) or die('Could not bind to address');
// Start listening for connections
socket_listen($sock);
// Loop continuously
while (true) {
   $file = fopen('txt.log','a'); 
    // Setup clients listen socket for reading
    $read[0] = $sock;
    for ($i = 0; $i < $max_clients; $i++)
    {
        if (isset($client[$i]))
        if ($client[$i]['sock']  != null)
            $read[$i + 1] = $client[$i]['sock'] ;
    }
    // Set up a blocking call to socket_select()
    $write = null;
    $except = NULL;
    $tv_sec = NULL;
    echo "connecting";
    $ready = socket_select($read,$write,$except,$tv_sec);
    /* if a new connection is being made add it to the client array */
    if (in_array($sock, $read)) {
        for ($i = 0; $i < $max_clients; $i++)
        {
            if (!isset($client[$i])) {

                $client[$i] = array();
                 socket_set_nonblock($sock); 
                $client[$i]['sock'] = socket_accept($sock);
                  $file = fopen('txt.log','a'); 

                echo("Accepting incomming connection...\n");
                break;
            }
            elseif ($i == $max_clients - 1)
                print ("too many clients");
        }
        if (--$ready <= 0)
            continue;
    } // end if in_array

    // If a client is trying to write - handle it now
    for ($i = 0; $i < $max_clients; $i++) // for each client
    {
        if (isset($client[$i]))
        if (in_array($client[$i]['sock'] , $read))
        {
            $input = socket_read($client[$i]['sock'] , 1024);
            if ($input == null) {
                // Zero length string meaning disconnected
                echo("Client disconnected\n");
                unset($client[$i]);
                fclose($file);
            }
            $n = trim($input);
            if ($n == 'exit') {
                echo("Client requested disconnect\n");
                // requested disconnect
                socket_close($client[$i]['sock']);
            }
            elseif ($input) {
                echo("Receiving data\n");
                // strip white spaces and write back to user
                $output = ($input);
                //socket_write($client[$i]['sock'],$output);
                 fwrite($file,$output);
                 echo $output."\r\n";


            }
        } else {
            // Close the socket
            if (isset($client[$i]))
            echo("Client disconnected\n");

            if ($client[$i]['sock'] != null){ 
                socket_close($client[$i]['sock']); 
                unset($client[$i]); 


            }

        }

    }
    fclose($file);//closing file
} // end while
// Close the master sockets
echo("Shutting down\n");
socket_close($sock);
fclose($file);

0 个答案:

没有答案