Bonjour,
je dois realiser un client qui est capable d'envoyer des messages sous forme de commandes pour le moment et plus tard recuperer des fichiers ou meme un flux video... mais ce n est pas pour tout de suite...
Si on en reste au cas de simples commandes, j'ai fait en sorte que mon client soit a l ecoute du serveur en permanence en creant un thread supplementaire qui contient une boucle infinie et dans laquelle je fais un
inputStream.readLine() etc..
Le main thread se charge de declarer divers methodes et l interface graphique. Entre autres, j ai une methode disconnect() qui ferment les flux de donnees entrants et sortants ainsi que le socket lorsque l utilisateur click sur le bouton "disconnect" de l interface graphique
Bien sur, en appuyant sur "disconnect", les flux sont fermes ainsi que le socket mais a ce moment, le thread tourne toujours et je pense que du au readLine(), cela declenche une exception qui me renvoit le message suivant:
dans ma boucle, j ai mis une condition sur socket.isConnect() ou meme le fameux readLine() != null pour sortir de la boucle si jamais la connection au serveur a ete coupe mais initie par le client. Or quoique je fasse, j ai toujours cette exception et si je teste les variables, elles ne sont pas mis a jour directement donc socket.isConnect() est toujours a true meme quand je viens de fermer le socket. J ai essaye de reduire les timeout, creer une variable secondaire et utiliser des methodes qui synchronisent les changements sur la variable ou meme de faire dormir le thread le temps qu il prenne en compte la fermeture du socket mais rien a faire. Je dois donc faire une erreur et voici, je crois, les parties du codes qui pourront vous aider:java.net.SocketException: socket closed
et le code du thread:
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 /* Method which closes socket, streams and disable components that can only be used while connected */ public void disconnect(int cases) { try { if(cases == 0) clientOutput.println("Closing connection"); // Client initiates the disconnection. if(cases == 1) clientOutput.println("Server closed the connection"); // Server initiates the disconnection, once detected, start disconnect procedure. set(false); clientOutput.close(); clientInput.close(); socket.close(); GraphicalUserInterface.setEnabledComponents(socket.isClosed()==true); GraphicalUserInterface.addNewInformationToCommandWindow("Disconnected from " + serverName + "."); } catch(IOException e) { System.out.println("Error closing socket."); System.exit(1); } }
Merci pour votre aide et bonne journee!
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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 /* Subclass that redefines Reader class to create a thread that will always be able to listen to the server while connected */ public class IReader extends Thread { XilinxClient client; public int test = 0; public IReader(XilinxClient c) { //super("Client Reader"); this.client = c; } public void run() { clientInput = null; String messageFromServer=""; try { //Link the socket input stream to the buffered reader clienInput to be able to display the message sent by the server. clientInput=new BufferedReader(new InputStreamReader(client.socket.getInputStream())); while(true) { if (messageFromServer == "Closing connection") { //If server instanciates the disconnection, initate disconnection procedure client.disconnect(DISCONNECTION_SERVER); break; } else { System.out.println(clientInput.readLine()); if(client.socket.isConnected()) { //Otherwise, copy the message that has been extracted from the InputStream. messageFromServer = clientInput.readLine(); client.GraphicalUserInterface.addNewInformationToCommandWindow("Server said: " + messageFromServer);} } } } catch (IOException e) { System.out.println("Reader: " + e); } finally { try {if (clientInput != null) clientInput.close();} catch (IOException e) {;} } System.exit(0); } }
Partager