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
Partager