간단한 클라이언트/서버 응용 프로그램을 만들려고하고 있으므로 PHP로 소켓을 실험하고 있습니다.PHP 소켓 - 다중 연결 허용
이제 서버에 잘 연결되는 간단한 클라이언트가 있지만이 서버에 한 번에 하나의 클라이언트 만 연결할 수 있습니다.이 코드 예제는 온라인에서 찾았으며 테스트 목적으로 약간 수정했습니다. , https://stackoverflow.com/questions/10318023/php-socket-connections-cant-handle-multiple-connection
나는 그것의 모든 부분을 이해하기 위해 노력하고 나는 그것이 구체적으로 어떻게 작동하는지보고에 가까운 해요,하지만 몇 가지 이유 :
재미는 충분히 여기 같은 예에 따라, 같은 질문을 발견 두 번째 클라이언트에 연결할 때 첫 번째 클라이언트가 연결이 끊어 지거나 충돌이 발생합니다.
누구나 내가 봐야 할 야생 아이디어 또는 포인터를 줄 수 있습니까?
<?php
// Set time limit to indefinite execution
set_time_limit (0);
// Set the ip and port we will listen on
$address = '127.0.0.1';
$port = 9000;
$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) {
// 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()
$ready = socket_select($read, $write = NULL, $except = NULL, $tv_sec = NULL);
/* 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();
$client[$i]['sock'] = socket_accept($sock);
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]);
}
$n = trim($input);
if ($n == 'exit') {
echo("Client requested disconnect\n");
// requested disconnect
socket_close($client[$i]['sock']);
}
if(substr($n,0,3) == 'say') {
//broadcast
echo("Broadcast received\n");
for ($j = 0; $j < $max_clients; $j++) // for each client
{
if (isset($client[$j]))
if ($client[$j]['sock']) {
socket_write($client[$j]['sock'], substr($n, 4, strlen($n)-4).chr(0));
}
}
} elseif ($input) {
echo("Returning stripped input\n");
// strip white spaces and write back to user
$output = ereg_replace("[ \t\n\r]","",$input).chr(0);
socket_write($client[$i]['sock'],$output);
}
} 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]);
}
}
}
} // end while
// Close the master sockets
echo("Shutting down\n");
socket_close($sock);
?>
혹시 이걸 가지고 행운이 있었나요? –
참조 : [SocketServer.class.php] (https://gist.github.com/navarr/459321) – kenorb