IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[sockets] Script "Chat" [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Par défaut [sockets] Script "Chat"
    Bonjour =)

    Afin d'apprendre a manier les sockets, je m'essaye a des scripts type "Chat". Actuellement je suis sur un script qui ne fonctionne pas parfaitement.

    A l'heure actuelle, il ne s'affiche rien, mais je déduis que l'échange de sockets s'effectue a peut prêt bien.

    Voici le script faisant office de serveur:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
    ?>

    Script censé récupéré et afficher les sockets:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
    set_time_limit(0);
     
    $adresse='127.0.0.1';
    $port=10001;
    ob_start();
    $pseudo=$_POST['pseudo'] ;
     
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if(!@socket_connect($socket, $adresse, $port))
            echo "Le serveur n'est pas lancé";
    else
            {
            $message = $pseudo." /connect";
            socket_write($socket, $message , strlen($message));
            while(true)
                    {
                    if($input = @socket_read($socket, $port))
                            {
                            $pseudo = stripslashes(utf8_decode(substr($input , 0 , strpos($input , ' '))));
                            $message = stripslashes(utf8_decode(substr($input , strpos($input , ' ')+1 , strlen($input))));
                            echo '['.$pseudo.']: '.$message.'<br />';
                            ob_flush();
        					flush();
                            }
                    else
                            {
                            echo "Le serveur a été éteint";
                            break;
                            }
                    }
            socket_close($socket);
            }
    ?>

    Et le script qui envoie les chaine au serveur:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php   
    $adresse='127.0.0.1';
    $port=10001;
    if(!empty($_GET['message']))
            {
            //Création de la socket
            $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
            //Connexion au serveur
            socket_connect($socket,$adresse,$port);
            //Construction du paquet à envoyer au serveur
            $paquet=str_replace(' ' , '&nbsp;' ,$_GET['pseudo']).' '.$_GET['message'];
            //Ecriture du paquet vers le serveur
            socket_write($socket,$paquet,strlen($paquet));
            //Fermeture de la connexion
            socket_close($socket);
            }
    ?>

    J'ai l'impression que les sockets s'échange, mais que l'affichage ne s'effectue pas (flush?)

    Merci d'avance a qui me donnera une piste ou un coup de main

  2. #2
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Par défaut
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    flush();
    ob_flush();
    Mieux placé, et ca a fonctionné =)

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo