par
TiTuB » 13 janv. 2010, 22:07
Bien le bonjour. J'vous mets le code d'un serveur en socket pour un chat multi-utilisateur. Ensuite, j'vous décris mon problême.
<?php
require('../includes/class/class_serveur.php') ;
set_time_limit(0) ;
class Chat_Server
{
var $socket=NULL ;
var $client=NULL ;
function Start($adresse,$port)
{
echo 'Lancement du serveur...'."\n" ;
$bdd = new bdd ;
$this->clients = array() ;
$this->socket = socket_create(AF_INET, SOCK_STREAM, 0) ;
@socket_bind($this->socket, $adresse, $port) or die('Erreur : Port deja utilise !'."\n") ;
socket_listen($this->socket) ;
echo 'Serveur lance.'."\n" ;
while(true)
{
$this->client = socket_accept($this->socket) ;
$id_msg = socket_read($this->client, 255) ;
if (strpos($id_msg, '/connect'))
{
echo 'Connexion !'."\n" ;
$user = explode(' ', $id_msg) ;
$user = $user[0] ;
//if (!array_key_exists($user , $this->clients))
$this->clients[$user] = $this->client ;
}
else
{
//Resultat d'une requete que j'ai supprimé pour le post.
echo date('H:i:s', $message['date']).' # '.$message['pseudo'].' : '.$message['message']."\n" ;
foreach($this->clients as $nom_case => $socket_en_cours)
{
if(socket_write($socket_en_cours, $id_msg, strlen($id_msg)) === false)
{
unset($this->clients[$nom_case]) ;
echo 'Deconnexion !'."\n" ;
}
}
socket_close($this->client) ;
flush() ;
}
}
}
}
$chat = new Chat_Server() ;
$chat->Start('tralalapoum.com', 3333) ;
?>
Il y a deux cas de figure en cas de connexion : un premiere connexion contenant le mot clé "/connect". On stock la socket concerné dans un tableau associatif.
Deuxième cas de figure, pas de mot clé "/connect", c'est un message à rediriger sur les clients.
Le problême est le suivant : il faut fermer les sockets après utilisation quand elles annoncent une connexion, ou quand elles apportent un message. Hors, je stock les sockets dans un tableau, celles ci ne doivent pas être fermé, vu qu'elles recevront les messages plus tard. Mais si je ferme une socket "/connect" après l'avoir enregistré dans mon tableau, ca supprime AUSSI celle du tableau alors que je devrais la conserver...
Je ne vois pas de solution. Si quelqu'un a une idée de comment régler le problème, c'est pas de refus !
J'éspère avoir été assez claire, je peux ajouter toutes les précisions nécessaire.
Merci d'avance.
Bien le bonjour. J'vous mets le code d'un serveur en socket pour un chat multi-utilisateur. Ensuite, j'vous décris mon problême.
[php]<?php
require('../includes/class/class_serveur.php') ;
set_time_limit(0) ;
class Chat_Server
{
var $socket=NULL ;
var $client=NULL ;
function Start($adresse,$port)
{
echo 'Lancement du serveur...'."\n" ;
$bdd = new bdd ;
$this->clients = array() ;
$this->socket = socket_create(AF_INET, SOCK_STREAM, 0) ;
@socket_bind($this->socket, $adresse, $port) or die('Erreur : Port deja utilise !'."\n") ;
socket_listen($this->socket) ;
echo 'Serveur lance.'."\n" ;
while(true)
{
$this->client = socket_accept($this->socket) ;
$id_msg = socket_read($this->client, 255) ;
if (strpos($id_msg, '/connect'))
{
echo 'Connexion !'."\n" ;
$user = explode(' ', $id_msg) ;
$user = $user[0] ;
//if (!array_key_exists($user , $this->clients))
$this->clients[$user] = $this->client ;
}
else
{
//Resultat d'une requete que j'ai supprimé pour le post.
echo date('H:i:s', $message['date']).' # '.$message['pseudo'].' : '.$message['message']."\n" ;
foreach($this->clients as $nom_case => $socket_en_cours)
{
if(socket_write($socket_en_cours, $id_msg, strlen($id_msg)) === false)
{
unset($this->clients[$nom_case]) ;
echo 'Deconnexion !'."\n" ;
}
}
socket_close($this->client) ;
flush() ;
}
}
}
}
$chat = new Chat_Server() ;
$chat->Start('tralalapoum.com', 3333) ;
?>
[/php]
Il y a deux cas de figure en cas de connexion : un premiere connexion contenant le mot clé "/connect". On stock la socket concerné dans un tableau associatif.
Deuxième cas de figure, pas de mot clé "/connect", c'est un message à rediriger sur les clients.
Le problême est le suivant : il faut fermer les sockets après utilisation quand elles annoncent une connexion, ou quand elles apportent un message. Hors, je stock les sockets dans un tableau, celles ci ne doivent pas être fermé, vu qu'elles recevront les messages plus tard. Mais si je ferme une socket "/connect" après l'avoir enregistré dans mon tableau, ca supprime AUSSI celle du tableau alors que je devrais la conserver...
Je ne vois pas de solution. Si quelqu'un a une idée de comment régler le problème, c'est pas de refus !
J'éspère avoir été assez claire, je peux ajouter toutes les précisions nécessaire.
Merci d'avance.