begin process at 2012 05 27 22:20:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > CLIENT / SERVEUR : LES SOCKETS

CLIENT / SERVEUR : LES SOCKETS


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseau & Internet Classé sous :sockets, poo, client, serveur, socket Niveau :Initié Date de création :27/04/2011 Vu / téléchargé :3 463 / 388

Auteur : Morphinof

Ecrire un message privé
Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

 Description

Il y peu de sources utilisant les sockets ici, aussi voila un exemple de client / serveur en PhP afin d'illustrer l'utilisation des sockets.

Le serveur et le client sont décomposés en deux classe chacun : la classe de base implémentant les mécanismes d'ouverture des sockets, la lecture et l'écriture sur celles ci et tous les mécanismes de base, puis la classe qui va gérer la partie loop et le timeout.

Ici le client et le serveur sont très simplistes et s'échangent bêtement des messages sans s'arrêter mais le fonctionnement est la.

Pour tester cette source je vous conseille fortement d'utiliser Cygwin :)



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

CRÉER UN PARSEUR LL
Source avec Zip DESIGN PATTERNS - CREATEURS
Source avec Zip ABSTRACTHTML GENERATOR
Source avec Zip Source avec une capture DBOC - V3.1 [AJAX][PHP5]
Source avec Zip Source avec une capture DBOC 2.0 [AJAX][PHP5]

 Sources de la même categorie

INSPECTEUR DE PAGES (VÉRIFIEZ SI DES SITES AFFICHENT UN TEXT... par pablo836
Source avec Zip Source avec une capture GÉOLOCALISATION par pgl10
Source avec Zip TAPI : METTRE EN RELATION DEUX POSTES TELEPHONIQUES par ravery
Source avec Zip VALIDATEUR_3WC par lezj
Source avec Zip MYGGL GOOGLE API CLASS FOR BEGINERZ par lezj

 Sources en rapport avec celle ci

Source avec Zip MY.REMOTE : SERVEUR D'OBJETS PHP5 par inwebo
MIGAPROXY : PROXY EN PHP COMPILABLE AVEC BAMCOMPILE par qbasic
CLASS POUR SOCKETS par xstyled
SUPERVISION DE PORTS par fifi774
STATUS SERVEUR EN PHP par naruto uzumaki

Commentaires et avis

Commentaire de Afyn le 27/04/2011 19:40:03

Bonjour

Ca semble fonctionner ^^
C'est possible d'avoir plus d'infos ? sur le fonctionnement !

Merci d'avance

Commentaire de Morphinof le 28/04/2011 08:49:54

Hello !

Quand on lance le serveur celui ouvre une socket sur un port et écoutes toutes les connections client qui arrivent sur le dit port.
Le client lui ouvre une sockect qui se connecte via ce port au serveur.
Lorsqu'un client se connecte le serveur stocke ce client dans un tableau de client, le serveur envois régulièrement aussi un message "live" a sa liste pour retirer les clients déconnectes.

Voila ^^

Commentaire de Afyn le 28/04/2011 13:49:55

Autre précision :

Quand on connecte plusieurs clients, la fonction listen semble ne pas renvoyer les datas à tous les clients connectés.

(J'ai plein de choses à apprendre avec cette source ... elle est vraiment super)

Commentaire de Morphinof le 28/04/2011 14:29:28

Cette fonction réponds au client que si le client envoi un message comme suit : if (($datas = $this->read($client))) alors je reponds.

A priori ca devrai donc marcher, mais je n'ai pas pu tester avec plusieurs connections, est ce que le serveur te dit  qu'il y a 2 connectés et si oui est ce que tes deux clients envoient bien un message au serveur ?

Commentaire de Afyn le 28/04/2011 14:54:17

    /*
     * Boucle infinie du serveur, attente des connections
     */
    public function loop()
    {
        if(($client = socket_accept(self::$socket)) !== false)
        {
            echo 'New client '.$client.' has connected'.BR;
            self::$clients[] = $client;
        }
        
        $this->listen();

        ob_flush();
        usleep(SERVER_LOOP_SLEEP);
        
        if ($this->continue)
            $this->loop();
    }

J'ai une erreur avec cette ligne : if(($client = socket_accept(self::$socket)) !== false)

même lorsque le serveur tourne seul (personnes de connecté)

Je vois ça dans le fichier error_log :
socket_accept() [<a href='function.socket-accept'>function.socket-accept</a>]: unable to accept incoming connection [11]

Commentaire de Morphinof le 28/04/2011 15:14:49

Ah bizarre ca me fait pas ca chez moi, unable to accept incoming connection je dirait que soit ca viens du port que tu utilise soit ca viens peu être de ce bug : http://bugs.php.net/bug.php?id=29560 mais je suis pas sur a 100%, en tout cas au niveau de la structure c'est comme ca qu'il faut faire, tu peux essayer d'enlever le mode non bloquant des socket (socket_set_nonblock(self::$socket)) pour essayer de voir si ca change quelque chose.

Commentaire de Afyn le 28/04/2011 15:21:55

Pour info ->

En supprimant nonblock j'ai toujours le même warning (toutes les 5 secondes)

Commentaire de Morphinof le 28/04/2011 15:40:37

Hum je viens juste de vérifier a priori si il n'arrive pas a lire ca génère un warning et on peu pas l'empêcher, pour éviter ca mets un @ devant socket_accept ca enlèvera ce warning et de toute façon ce qui nous intéresse c'est de tester l'état false, sinon ca viens pas de socket_set_nonblock que j'ai mit justement pour permettre des connections simultanées de plusieurs clients.

Commentaire de Afyn le 28/04/2011 15:41:13

Du coup je peux plus relancer le serveur.
Peut être qu'on ne ferme pas la socket proprement et que le port reste utilisé ?

Commentaire de Morphinof le 28/04/2011 15:47:36

Normalement tout se ferme correctement soit par la fonction timeout soit en fermant le script, personnellement en utilisant Cygwin je n'ai pas eu ce genre de soucis alors je pense pas ^^

Commentaire de Afyn le 28/04/2011 15:49:47

Je teste sur un hébergement, pas en local.
Donc pas de Cygwin pour moi.
Mais bon on va trouver ... je suis confiant ^^

Commentaire de Morphinof le 28/04/2011 15:53:48

Ahh peu être que ton hébergeur bloque l'ouverture de on port alors non ?

Moi je teste en local alors forcement ca marche mais je suis pas sur que tu puisse ouvrir une socket serveur sur n'importe quel port chez un hébergeur classique enfin c'est une idée ^^

Commentaire de gigatrappeur le 02/05/2011 19:11:02 7/10

Code intéressant !

petite remarque :
la méthode loop de ton client : tu fais un appel récursif sur $this->loop
le problème est que lorsque tu fais un appel récursif, il empile sur le tas tes appels les un après les autres.
Et à un moment donné, ta mémoire sera pleine --> et crack !

il vaut mieux utiliser une boucle while...

public function loop()
{
    while ($this->continue)
    {
         ...
        
         $this->listen();
        
         ...
    }
}

autre remarque :
généralement, sur ce genre de code (qui existe plus en java), on utilise des threads.


Cordialement,
Gigatrappeur

Commentaire de Morphinof le 02/05/2011 19:26:34

Oui seulement il n'y a pas de gestion native des thread en PhP :(

Par contre on peu utiliser pcntl_fork puis créer une thread pool mais ca aurai rendu la source trop complexe, mon but c'est de laisser implémenter le comportement:)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Serveur Socket [ par Astalavista ] Je chercher le moyen de cree un serveur en PHP avec des sockets.Je compte fair un programme en un autre language (Client) qui communiquerais avec mon socket client (php) vers serveur (c++) [ par suleyman ] bonjour, je suis debutant, je nai jamais programmer une socket et jaimerai avoir le code source ainsi que les commentaires dune socket client et serve Question Sockets [ par Kazuya ] Bonjour, je me demandais une toute petite chose vis-à-vis des sockets en PHP. Lors d'un listen, qui écoute le port, le serveur ou le client ?si ce n'e Socket client serveur [ par massi723 ] Bonjour, Je veux créer un serveur en php pour recevoir des données envoyés en tcp par un client, Est-ce que quelqu'un a une idée a propos du code? mer sockets/php [ par agoumi ] bonjour a tous! bon j'ai réaliser une socket serveur en php sous linux,mais lors de l'execution j'ai l'erreur suivant: Fatal error: Call to undefined sockets [ par agoumi ] bonjour,je suis debutant, je nai jamais programmer les socketet jaimerai avoir le code source ainsi que lescommentaires d'une socket client en php, Mo Socket : Adresse d'un serveur [ par Leneuf8000 ] Bonjour, voil&#224;, j'ai trouv&#233; des sripts permettant l'envoi de mail et qui utilise la fonction fsockopen, or comme j'ai un probl&#232;me pour socket!!! [ par LaTatadu91 ] salut je voudrais tester un programme avec des sockets juste a titre d'exemple mais je ne sais pas comment faire pr faire un test sur ma machine ....c balises html non interprétées [ par tuco79 ] Bonjour, je fais des tests avec les sockets (afin de comprendre comment ça fonctionne) et le code suivant me pose quelques problèmes : [i]$address =


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,218 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales