Gaen вот скрипт вы можете помочь?
PHP код:
#!/usr/bin/php -q <?php
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
$address = 'localhost'; $port = 9996;
//---- Function to Send out Messages to Everyone Connected ---------------------------------------- function send_Message($allclient, $buf) { global $client_list; foreach($allclient as $client) { if($client_list[$client]['state'] && $client_list[$client]['nick'] != ""){ socket_write($client, trim($buf).chr(0)); } } }
//---- Function to Send List of Everyone Connected ---------------------------------------- function who($allclient, $socket) { global $client_list; $buf = ""; $counter = 0; foreach($allclient as $client) { $buf.=$client_list[$client]['nick'].", "; $counter++; } // socket_write($socket, "There are $counter people in this room: $buf".chr(0)); }
//---- Function to Send out Messages to Individuals ---------------------------------------- function send_Single($socket, $buf) { socket_write($socket, $buf.chr(0)); }
//---- Start Socket creation for PHP 5 Socket Server -------------------------------------
if (($master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { echo "socket_create() failed, reason: " . socket_strerror($master) . "\n"; }
socket_set_option($master, SOL_SOCKET,SO_REUSEADDR, 1);
if (($ret = socket_bind($master, $address, $port)) < 0) { echo "socket_bind() failed, reason: " . socket_strerror($ret) . "\n"; }
if (($ret = socket_listen($master, 5)) < 0) { echo "socket_listen() failed, reason: " . socket_strerror($ret) . "\n"; }
$read_sockets = array($master); $client_list = array($master);
//---- Create Persistent Loop to continuously handle incoming socket messages --------------------- while (true) { $changed_sockets = $read_sockets;
$num_changed_sockets = socket_select($changed_sockets, $write = NULL, $except = NULL, NULL);
foreach($changed_sockets as $socket) {
if ($socket == $master) {
//---- Accept Incoming Connections and Request Nickname ---------------------------------------- if (($client = socket_accept($master)) < 0) { echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; continue; } else { echo "[connection]:$client\n"; array_push($read_sockets, $client); $client_list[$client]['state'] = false; send_Single($client, "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\0"); } } else {
//---- Grab Incoming Messages From all Users ---------------------------------------- $bytes = socket_recv($socket, $buffer, 2048, 0);
//---- Handle User Disconnects ---------------------------------------- if ($bytes == 0) { $nick = $client_list[$socket]['nick']; $iindex = array_search($socket, $client_list); unset($client_list[$iindex]); $index = array_search($socket, $read_sockets); unset($read_sockets[$index]); socket_close($socket); $allclients = $read_sockets; array_shift($allclients); if($client_list[$socket]['nick'] != "" && $client_list[$socket]['nick'] != "<policy-file-request/>"){ send_Message($allclients, "$nick has left the room"); } }else{ if($bytes){ //---- Set Nickname ---------------------------------------- if($client_list[$socket]['state'] === false){ $client_list[$socket]['nick'] = $tempBuf = trim(trim($buffer)); echo $tempBuf." test"; //send_Single($socket, "Hello $tempBuf! Welcome to the game!"); $allclients = $read_sockets; array_shift($allclients); who($allclients, $socket); if($client_list[$socket]['nick'] != "" && $tempBuf != "<policy-file-request/>"){ //send_Message($allclients, $client_list[$socket]['nick']." has entered the game."); } $client_list[$socket]['state'] = true; }else{ //---- Check Message for Commands, and Respond or Broadcast Message ---------------------------------------- $allclients = $read_sockets; array_shift($allclients); if(trim($buffer) == "/who"){ who($allclients, $socket); }else{ send_Message($allclients, $client_list[$socket]['']."".$buffer); //send_Message($allclients, $client_list[$socket]['nick']." wrote: ".$buffer); } } } } } } }
?>
Добавлено через 11 минут
нужно как-то реализовать что-ли как комнаты для клиентов что-бы определенные клиенты общались с определенными клиентами! просто я делаю онлайн игру на flash и мне нужно реализовать свой внутренний чат для каждой комнате на одно сокете! поможете?
|