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 :

Rupture d'une connexion Socket


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Rupture d'une connexion Socket
    Bonjour à toutes et à tous,

    Après de nombreux tests et beaucoup de recherche, je me tourne vers Développez avec l'espoir que peut-être, le problème auquel je suis confronté trouvera sa solution.
    A mon sens, ce problème me semble davantage tenir de l'anomalie que du problème.

    Par pur loisir, j'ai développé une application multi-utilisateurs dont la communication est assurée par un serveur de socket codé en PHP. L'utilisateur s'identifie, le serveur l'enregistre et diffuse l'information à tous les membres connectés. Bref, tout fonctionne à merveille.

    L'anomalie rencontrée est la suivante :
    Selon la documentation PHP, socket_read renvoie FALSE lorsque la tentative de lecture sur une socket échoue. Autrement dit, quand la lecture sur une socket échoue, c'est parce que la connexion a été rompue. Donc que le client a quitté l'application. Concernant mon application, lorsque le client utilise Chrome, le fait qu'il se déconnecte se détecte instantanément. En revanche, lorsqu'il utilise Firefox, un délais variable d'environ 15/20 secondes s'écoule avant que le serveur ne détecte la déconnexion du client.

    Pensez-vous qu'il puisse s'agir d'un comportement du navigateur ? Dans ce cas, pourrait-on imaginer une parade ? Une requête Ajax asynchrone à la fermeture de la page qui serait en charge de forcer la déconnexion ?


    En simplifiant, voici la portion de code qui détecte la déconnexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $buf = @socket_read($this_socket, 2048, PHP_NORMAL_READ);
    if ($buf == false or $buf == '') {		
    	# Le membre vient de se déconnecter, on le supprime du tableau des resources co.
    	unset($sockets_connectes[array_search($this_socket, $sockets_connectes)]);
    	$its_name = array_search($this_socket, $membres_co);
    	unset($membres_co[array_search($this_socket, $membres_co)]);
    	send_message(array_diff($membres_co, array($this_socket)), 'leaving', $its_name);
    	echo 'déco';
    	break;
    }
    ?>
    Au plaisir de discuter.
    Dernière modification par Bovino ; 23/02/2015 à 10h14.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Visiblement le problème provient du navigateur. Etant donné que la manipulation des sockets avec HTML implique nécessairement JS, alors il semble logique d'utiliser JS pour forcer la déconnexion.
    Pour ceux qui comme moi seraient gênés par cette anomalie qui porte un coup au temps réel, la solution réside simplement en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		$(window).bind('beforeunload', function(){
    			var msg = { action: 'deconnexion', value: ...};
    			websocket.send(JSON.stringify(msg));
    		});
    Côté serveur, à la réception, il suffit simplement de supprimer la ressource des tableaux.

    Au plaisir.

Discussions similaires

  1. Redistribuer une connexion socket dans un réseau, WCF?
    Par zizou100 dans le forum Débuter
    Réponses: 4
    Dernier message: 10/04/2014, 01h51
  2. Relancer une connexion socket
    Par juju1988 dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 13/03/2012, 15h55
  3. Spécifier un répertoire dans une connexion socket
    Par hb2ee dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 16/04/2009, 10h20
  4. Réponses: 20
    Dernier message: 10/07/2006, 16h53
  5. Ouvrir une connexion socket
    Par toure32 dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2005, 21h22

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