Bonjour,
J'ai un problème dans le cadre d'une application qui sert de serveur de tchat.
En gros il y a deux class principales RomuServer et AquaClientThread.
RomuServer contient le main, un serverSocket, et un Vector de la liste des clients.
Le serverSocket écoute et lorsqu'une connexion est acceptée, un nouveau AquaClientThread est créé et le stocke dans le :
static Vector clientList= new Vector(); de la class RomuServer.
Le problème est que le programme "plante", à certain un moment.
C'est très aléatoire, il peut tenir 2 heures comme 2 jours avec 10 connectés ou 60.
Donc j'ai essai de savoir d'où venait le problème en faisant des println partout à chaque début et fin de fonction et même plus.
Et j'ai reussi à voir que le problème se créait dans cette fonction :
Donc cette fonction est dans la class principale RomuServer, et parcoure le Vector pour envoyer à tous les clients un message.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 static synchronized void sendToAllClients(String message) { AquaClientThread foo; Iterator client_it = clientList.iterator(); try { while(client_it.hasNext()) { foo = (AquaClientThread)client_it.next(); if (foo!=null) { // dernier println possible lorsque le problème survient foo.send(message,"MESSAGE"); } } } catch(Exception ex) { echo("plantage sendToAllClients "+ex); } }
Elle fonctionne la plus part du temps correctement, mais parfois la class RomuServer "freeze", le programme continue de tourner et les threads font encore leur boulot.
Quand cela arrive, plus rien ne se passe sur RomuServer, et la dernièr action qu'il arrive à faire est un println juste avant le food.send().
La fonction send ne se lance pas d'ailleurs dans le thread concerné, quand le problème survient.
Je rappelle que la plupart du temps que la fonction sendToAllClients fonctionne correctement, mais qu'au bout d'un certain temps, très aléatoire, et à un certain moment dans la boucle, un foo.send fait freezer RomuServer, et je suis obligé d'arrêter le programme et de le relancer.
Merci de m'aider, ou de donner des pistes s'il vous plait.
Partager