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

Entrée/Sortie Java Discussion :

Socket et détection d'une perte de connexion


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club Avatar de Tigrounette
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 69
    Points
    69
    Par défaut Socket et détection d'une perte de connexion
    Bonjour à tous,

    J'ai un problème assez basique mais que je n'arrive pas à comprendre.

    J'utilise un serveur en java pour un jeu multijoueur. Lorsqu'un joueur se connecte au serveur, celui-ci lui crée un thread dédié. Quand je quitte le serveur, les joueurs sont déconnecté automatiquement et lorsque qu'un joueur quitte le client, le serveur détecte automatiquement cette deconnexion et arrête le thread du joueur.

    Jusque là tout vas bien. Le problème c'est lorsque un joueur est connecté au serveur et qu'il perd sa connexion internet. Dans ce cas, le client fini par se déconnecter au bout de 30 secondes mais le serveur fait comme si de rien n'était, le joueur (enfin ce qu'il en reste) n'est jamais deconnecté côté serveur. Je comprend pas trop, car il me semblait que ce genre de chose était géré directement dans le protocole TCP.

    Voici le code que j'utilise pour mon serveur :

    Code java : 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
    public void run() {
    	try {
    		StringBuilder Message = new StringBuilder(100);
    		char Caractere[] = new char[1];
    		while (Socket_In.read(Caractere, 0, 1) != -1) {
    			char C = Caractere[0];
    			if (C == 0) {
    				String MessageString = Message.toString();
    				Message = new StringBuilder(100);
    				Analyse_Message(MessageString);
    			} else {
    				Message.append(C);
    			}
    		}
    	} catch (Exception e) {
    		Deconnexion("Erreur de lecture du flux.");
    		e.printStackTrace();
    	} finally {
    		Deconnexion("Fermeture du client");
    	}
    }

    avec dans le constructeur :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    Socket_In = new BufferedReader(new InputStreamReader(Socket.getInputStream()));

    Quelqu'un pourrait m'expliquer comment détecter ce genre de perte de connexion entre un client et un serveur ?

    Merci d'avance !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Je ne suis pas professionnel, loin de là, mais je pense que l'utilisation d'un timeout pourrait faire l'affaire.

    pour cela tu as la fonction setSoTimeout(temps_en_ms) qui s'applique sur les socket :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Socket maSock = new Socket("localhost", 4444);
    maSock.setSoTimeout(1000);
    try {
    // ... traitement ...
    } catch (SocketTimeoutException ste) {
         // ... traitement en cas de timeout ...
    }
    Le soucis vient alors du fait que si il n'y a pas de discution entre ton client et ton serveur pendant plus longtemps que la valeur du timeout, alors l'exception est lancée ... Mais il te reste aussi la fonction isConnected() qui retourne un booléen ! Magie ^^ (code non testé ... désolé :p)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // .... bla bla bla ... 
    catch (SocketTimeoutException ste) {
         if(!maSock.isConnected())
                maSock.close();
    }

    Je répète je n'ai pas testé le code mais c'est ce qui me semble adapté, non ?

  3. #3
    Membre du Club Avatar de Tigrounette
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 69
    Points
    69
    Par défaut
    Après quelques test, les méthodes :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Socket.isConnected();
    Socket.isClosed();
    Socket.isBound();
    Socket.isInputShutdown();
    Socket.isOutputShutdown();

    retourne exactement la même chose avant et après une perte de connexion :/

  4. #4
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Avec les java.io (Socket/ServerSocket) il est impossible de rééllement detecter une perte de connection du peer (correspondant distant).

    Par contre avec java.nio (Selector et SelectionKey) il me semble que c'est possible (du moins si le peer ferme la connection proprement)

    Les méthodes Socket.isClosed() & co permettent de savoir si "tu" as fermé le socket mais ne tient pas compte du distant.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  5. #5
    Membre du Club Avatar de Tigrounette
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 69
    Points
    69
    Par défaut
    En fait, j'ai essayé de faire un truc avec Socket.setSoTimeout() comme indiqué par Napalm51.

    Chaque client envoie une chaine vide toute les 40 secondes. Et j'ai régler le setSoTimeout() du Socket serveur à 60 secondes. Donc si un client à une perte de connexion ou un gros lag de plus de 20 secondes, le serveur le deconnecte comme il faut.

    Je sais pas si c'est une bonne méthode mais ça marche

    Merci en tout cas !

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Autre solution : tu peux envisager un dispositif par lequel le client envoi toutes les 30 secondes un message qui indiquerait au serveur qu'il est toujours connecté.

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Ah tu m'as devancé C'est cool que tu ais trouvé une solution.

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

Discussions similaires

  1. La meilleure manière de détecter une perte de connexion ?
    Par SergioMaster dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/09/2014, 20h14
  2. Diagnostiquer une perte de connexion
    Par Erwan31 dans le forum Windows 7
    Réponses: 0
    Dernier message: 05/10/2010, 22h00
  3. Détection d'une perte de lien avec Ajax
    Par Lord Yu dans le forum ASP.NET
    Réponses: 3
    Dernier message: 24/02/2010, 23h16
  4. Détection perte de connexion
    Par looping dans le forum Débuter
    Réponses: 8
    Dernier message: 14/12/2008, 14h01
  5. Problème sockets perte de connexion
    Par jabadao dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 07/11/2007, 15h31

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