Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Points particuliers > Comment utiliser les sockets avec php ? Comment faire un chat avec les sockets ? > Partie pratique : la création du chat > Récapitulation, le code > Lecture du tutoriel

Récapitulation, le code

Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Avatar
Auteur : azmeuk
Note : 17 / 20 (11 votes)
Visualisations : 6 914

Plus d'informations Plus d'informations
Voici l'intégralité du code que nous avons fait tout à l'heure.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire

entree.php

Code : HTML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Chat</title>
</head>
<body>
<div>
<h3>Choisis un pseudo</h3>
<form action="client.php" method="get">
<input type="text" name="pseudo" value="pseudo" />
<input type="submit" value="Entrer" />
</form>
</div>
</body></html>

reception.php

Code : PHP
 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
<?php
set_time_limit(0);

$adresse='127.0.0.1';
$port=35353;

$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 />';
                        flush();
                        }
                else
                        {
                        echo "Le serveur a été éteint";
                        break;
                        }
                }
        socket_close($socket);
        }
?>

send.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php   
$adresse='127.0.0.1';
$port=35353;
if(!empty($_POST['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;' ,$_POST['pseudo']).' '.$_POST['message'];
        //Ecriture du paquet vers le serveur
        socket_write($socket,$paquet,strlen($paquet));
        //Fermeture de la connexion
        socket_close($socket);
        }
?>

client.php

Code : HTML
 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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<title>Chat</title>
<script type="text/javascript">
function envoi_message()
        {
        var xhr_object = null;
       
        if(window.XMLHttpRequest) // Firefox
           xhr_object = new XMLHttpRequest();
        else
                {
                if(window.ActiveXObject) // Internet Explorer
                        xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
                else // XMLHttpRequest non supporté par le navigateur
                        {
                        alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
                        return;
                        }
                }
         
        var method   = "POST";
        var filename = "send.php";
        var requete  = "message=" + document.getElementById("envoyer").value + "&pseudo=" + document.getElementById("pseudo").value;

        xhr_object.open(method, filename, true);

        xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

        xhr_object.send(requete);

        //On efface le champ d'envoi, et on lui redonne le focus
        document.getElementById("envoyer").value="";
        document.getElementById("envoyer").focus();
        }

function reception()
        {
        var xhr_object = null;
        var div = document.getElementById('content');

        if(window.XMLHttpRequest) // Firefox
           xhr_object = new XMLHttpRequest();
        else
                {
                if(window.ActiveXObject) // Internet Explorer
                        xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
                else // XMLHttpRequest non supporté par le navigateur
                        {
                        alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
                        return;
                        }
                }
       
        var method   = "POST";
        var filename = "reception.php";
        var requete  = "pseudo=" + document.getElementById("pseudo").value;
                var taille = 0; //Le nombre de caractères déjà reçus
                        var update = function()
                                {
                if(xhr_object.readyState == 3 && xhr_object.responseText.length > taille)
                    {
                    taille = xhr_object.responseText.length;
                    var reponse = xhr_object.responseText;
                    document.getElementById("content").innerHTML = reponse;
                    div.scrollTop = div.scrollHeight;
                    }
            setTimeout(update,100); //Se relance toute les 100 ms (voire moins ?)
            };
        update();

        xhr_object.open(method, filename, true);

        xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

        xhr_object.send(requete);

        }
</script>
</head>
<body onLoad="reception()">
<div id="content" style=" background-color:#E7F2F8; height:350; overflow:auto; "></div>
<div>
<form action="client.php" method="post" name="useless" onSubmit="return(false)">
<input type="text" size="50" name="envoyer" id="envoyer" />
<input type="submit" value="Envoyer" onClick="envoi_message()" />
<input type="hidden" id="pseudo" value="<?php echo $_GET['pseudo']; ?>" />
</form>
</div>
</body></html>

serveur.php

Code : PHP
 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
<?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)
        {
        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";
                        flush();
                        }
                }
        }
}
$chat = new Chat_Server();
$chat->Start('127.0.0.1',35353);
?>

Chapitre précédent Sommaire
Retour en haut Retour en haut


Créé : le 31/01/2006 à 16:35:58
Modifié : le 25/09/2008 à 18:58:54
Avancement : 100%
Licence : Copie non autorisée

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 352 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0613s (0.0321s)