1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| <?php
set_time_limit(0);
//On crée notre classe
class Chat_Server
{
var $socket=NULL;
var $client=NULL;
//Méthode qui démarre le serveur
function Start($adresse,$port)
{
ob_start();
echo"Lancement du serveur...\n";
$this->clients=array();
//Création de la socket
$this->socket = socket_create(AF_INET, SOCK_STREAM, 0);
//on lie la ressource sur laquelle le serveur va écouter
@socket_bind($this->socket, $adresse, $port) or die("Port déja utilise\n");
//On prépare l'écoute
socket_listen($this->socket);
//Boucle infinie, car le serveur ne doit s'arrêter que si on lui demande
while(true)
{
//Le code se bloque jusqu'à ce qu'une nouvelle connexion client soit établie
$this->client = socket_accept($this->socket);
//Cette méthode lit les données reçues par un client, et les redistribue
$reception = socket_read($this->client , 255);
$pseudo = substr($reception , 0 , strpos($reception , ' '));
$message = substr($reception , strpos($reception , ' ')+1 , strlen($reception));
//Le message est "/connect", donc on stocke la socket dans le tableau
if($message == "/connect")
{
$this->clients[$pseudo]=$this->client;
echo "$pseudo connected\n";
}
//C'est donc un message : ici on va envoyer le message vers chacun des clients
else
{
echo "Pseudo: [".$pseudo."] Message recu: [".$message."] Message envoye a : ";
//On passe chaque case du tableau = chaque client, et on lui envoie le message
foreach( $this->clients as $nom_case => $socket_en_cours)
{
//Si ça ne marche pas, c'est qu'il est déconnecté
if(@socket_write($socket_en_cours, $reception, strlen($reception)) === false)
{
//La socket est enlevée du tableau
unset($this->clients[$nom_case]);
echo "[$nom_case s'est deconnecte]";
}
else
echo "$nom_case ";
}
//On ferme la socket qui vient de nous apporter un message
socket_close($this->client);
echo"\n";
ob_flush();
flush();
}
}
}
}
$chat = new Chat_Server();
$chat->Start('127.0.0.1',10001);
?> |