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 :

Erreur de socket


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    Par défaut Erreur de socket
    Bonjour à tous,

    Je travaille sur un jeu multijoueur ou la partie serveur est en java. Mais hier, j'ai découvert un bug incompréhensible et j'ai besoin de votre aide

    Je vais tenter d'expliquer mon bug :

    Chaque client qui se connecte sur le serveur déclenche la création d'un thread. J'utilise la méthode run() suivante pour la réception de donnée de chaque thread :

    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
    22
    23
    24
    25
    26
    27
    public void run() {
    	System.out.println(AdresseIP + ".Connexion");
    	try {
    		StringBuilder Message = new StringBuilder(100);
    		char charCur[] = new char[1];
    		while (_in.read(charCur, 0, 1) != -1) {
    			char C = charCur[0];
    			if (C != '\u0000') {
    				Message.append(C);
    			} else {
    				String MessageString = Message.toString();
    				Message = new StringBuilder(100);
    				Traitement_Message(MessageString);
    			}
    		}
    	} catch (Exception e) {
    		e.printStackTrace();
    		Deconnexion("Erreur de lecture du flux.");
    	} finally {
    		System.out.println("FIN " + NomJoueur);
    		Deconnexion("Fermeture du client");
    	}
    }
     
    // Où _in est déclaré dans le constructeur de cette façon :
    _in = new BufferedReader(new InputStreamReader(_s.getInputStream()));
    // _s est le socket passé en paramètre

    J'ai quelques lacunes en java, notement tout ce qui touche les Exception. J'ai tendance à ne jamais les utiliser et je ne sais pas très bien comment elle fonctionne.

    Je sais seulement que lorsque qu'une exception est relevé dans le thread d'un client, le serveur execute ce qu'il y a dans le "catch" puis le "finally" un peu plus haut. Et que quand le joueur quitte le client, le serveur execute seulement le "finally".

    Jusque là ça marchait plutôt bien. Mais là j'ai un drôle de bug. Lorsque que j'effectue une action spécifique, sans qu'une exception soit levée, le serveur execute ce qu'il y a dans le "finally".

    Ca a pour conséquense de lancer la méthode Deconnexion() Et la premiere chose que j'ai dans cette méthode c'est ce code :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
    	_s.close();
    	System.out.println(_s.isClosed());
    } catch (Exception e) {
    	e.printStackTrace();
    }

    Même s'il me met un jolie "true" comme quoi le socket est bien fermé, le client n'est pas déconnecté et continue à envoyer des informations puis à en recevoir.

    Comment mon thread peut encore recevoir des informations après ça ?

    Quelles sont les raisons qui peuvent déclencher l'execution de ce finally sans lever d'Exception ? (sans compter la fermeture du socket côté client)

    Ya t'il un moyen de trouver le bout de code qui déclenche tout ceci ? (j'ai essayé avec des System.out.println partout sans résultat

    Bref, je cherche des indices car je ne sais pas dutout d'où peut provenir le problème (ça se trouve c'est super simple )

    Merci d'avance :p

  2. #2
    Membre chevronné Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Par défaut
    Je sais seulement que lorsque qu'une exception est relevé dans le thread d'un client, le serveur execute ce qu'il y a dans le "catch" puis le "finally" un peu plus haut. Et que quand le joueur quitte le client, le serveur execute seulement le "finally".
    même si aucune exception n'est levée, le block finally s'executera quand même.

    A Finally block will be executed after a try block if no exception has been thrown or after a catch if an exception was thrown. This means that a finally block can be used as 'clean up' - a place to close files or connections etc, whether an exception is thrown or not.

    If a try block throws an exception and the catch block propagates the exception (throws it again), the finally clause will still execute. If the finally clause executes a return statement, it overides a thrown exception (so the exception will not be thrown; instead the return will occur).
    je pense que ce que tu veux faire c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try{
    //qq chose
    }catch(Excepetion1 e){
    //autre qq chose
    }
    catch(Exception2 b){
    //troisieme qq chose
    }
    et a mon avis l'exception qui t'interresse est SocketException (broken pipe), enfin je pense.

    a+

  3. #3
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    3 remarques :
    - concernant le bloc finally, je suis entièrement daccord avec Let_me_in
    - tu dis que ton client peut continuer d'envoyer des messages, cela me semble normal car à chaque message envoyé un nouveau thread est créé pour traiter son messages. Si tu veux qu'il dialogue jusqu'à un moment précis, il faudrait faire une boucle dans ton run, qui se stopperait par exemple à la réception d'un messgage "fin".
    - enfin pour faire une déconnexion propre, tu dois également fermer les flux d'entrées/sorties en plus de la socket.

    Bon courage.

Discussions similaires

  1. Erreur communication socket
    Par docr1 dans le forum Applets
    Réponses: 5
    Dernier message: 21/07/2008, 17h59
  2. Erreur de socket
    Par Marnage dans le forum Réseau
    Réponses: 9
    Dernier message: 22/01/2008, 14h03
  3. erreur de socket avec applet
    Par fumiste972 dans le forum Applets
    Réponses: 3
    Dernier message: 18/07/2006, 16h11
  4. Erreur connexion socket
    Par tilte dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/04/2006, 23h48
  5. Erreur de socket avec le composant Indy idHTTP
    Par Etanne dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/10/2004, 11h27

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