Bonjour,
Je travaille sur un petit programme client/serveur pour faire du chat. Le programme client a une classe Client (dans la quelle il y a la fonction main), une classe Connexion et d'une classe Gui. L'interface est faite avec SWT. (pour info, je bosse avec Eclipse 3.2)
J'ai vu plusieurs exemples de petits programmes clients/serveur, mais je ne parviens pas à résoudre mon problème :
La classe Connexion fonctionne en tant que thread (public class Connexion extends Thread { ... } )
Voila sa fonction run() :
et voila la fonction main (dans la classe Client) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public void run(){ this.gui.display.asyncExec(new Runnable() { //this.gui est un pointeur vers l'instance de la classe Gui dans main public void run() { try { String fromServer; while ((fromServer = in.readLine()) != null) { gui.zoneDeTexte.insert(fromServer); } } catch (IOException e) { } }}); }
Code : 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 public static void main(String[] args) { // GUI gui.Gui gui = new gui.Gui(); // connection tcp.Connexion connexion = new tcp.Connexion(gui); gui.createSShell(); gui.sShell.open(); while (!gui.sShell.isDisposed()) { if (!gui.display.readAndDispatch()) gui.display.sleep(); } System.out.println("finishing..."); gui.display.dispose(); }
dans l'interface, il y a un bouton "Se connecter" qui, lorsque on appuie dessu lance connexion.connect() qui connecte le client au serveur (ça ça marche bien) et démarre le thread en faisant this.start();
En fait, tout marche bien à une chose près : la commande in.readLine() dans la fonction run() bloque tout le reste en attendant de recevoir quelque chose du serveur. L'interface est complètement figée.
Si j'enlève :
while ((fromServer = in.readLine()) != null) { gui.zoneDeTexte.insert(fromServer);
}
tout fonctionne bien à ceci près que les messages envoyés par le serveur ne seront (par conséquent) pas affichés...
Que dois-je faire pour que la fonction in.readLine() ne fige pas l'interface ? Je pensais que le simple fait que ce soit dans un thread ferait que l'interface peut se rafraichir en parellèle, mais non
Comment faire ?
merci d'avance
Partager