Bonjour je réalise une application de messagerie instantannée en utilisant les sockets. La communication entre les clients (via le serveur) se passe bien, le probleme est lorsqu'un client quitte l application (en envoyant un message à aucun destinataire) j'ai une exception en boucle : java.io.IOException: Stream closed coté client et coté serveur aucune exception ne se produit.
Je pense pourtant que les socket et les flux d'entree/sortie sont fermés au bon moment. Est ce que quelqu'un aurait une idéé?
voici mon code
classe client
classe ReceptionThreadClient
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 import java.net.*; import java.io.*; import java.awt.event.*; import javax.swing.*; import java.lang.Runnable; import java.util.*; public class client { Socket soc; protected String pseudo; BufferedReader entree; PrintWriter sortie; String msg; public client (String pseudo){ this.pseudo=pseudo; } public void connexion() throws IOException{ try{ InetAddress ip = InetAddress.getByName("192.168.1.36"); System.out.println("Adresse ip du serveur : " + ip); soc = new Socket (ip, Server.port); System.out.println("Socket : " + soc); entree = new BufferedReader(new InputStreamReader(soc.getInputStream())); sortie = new PrintWriter(new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())),true); System.out.println("initialiser"); sortie.println(this.pseudo); new ReceptionThreadClient(entree,soc).start(); while (true){ this.envoyer(); } }catch (Exception e) { e.printStackTrace(); } } public void envoyer(){ while(true){ String psd, com; msg=this.pseudo+","; System.out.println("Pseudo de l interlocuteur"); psd = Lire.jstring(); msg=msg+psd+","; System.out.println("Message a envoyer"); com = Lire.jstring(); msg=msg+com; sortie.println(msg); if(psd.equals("")){ sortie.close(); break; } } }
et les classes côté serveur
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 import java.io.BufferedReader; import java.io.PrintWriter; import java.net.*; public class ReceptionThreadClient extends Thread { BufferedReader reception; Socket soc; String msg; public ReceptionThreadClient(BufferedReader reception, Socket soc){ this.reception=reception; this.soc=soc; } public void run(){ while (true){ try{ msg=reception.readLine(); if(msg.equals("fin")){ reception.close(); soc.close(); } System.out.println(msg); }catch (Exception e){ System.out.println(e); } } } }
classe Server
classe ThreadServer :
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
35
36
37
38
39
40
41
42
43
44
45
46
47 import java.net.*; import java.io.*; import java.util.*; public class Server { static final int port = 8080; static Map<String,Socket> map = new HashMap(); public static void main (String [] args){ int i; int num = 1; int nsoc = 0; try{ ServerSocket srv = new ServerSocket(port); System.out.println("Démarré " + srv); while (true){ Socket conect = srv.accept(); System.out.println("Connexion accepté : " + conect); new ServerThread (conect, num++).start(); } }catch (Exception e){ System.out.println(e); } }
Merci d'avance pour votre aide car cela fait 3-4 jours que je bute la dessus
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 import java.net.*; import java.lang.*; import java.io.*; import java.util.*; public class ServerThread extends Thread { private Socket conect; private int num; BufferedReader reception; PrintWriter envoi; String msgp, msg; //String dest, exp; //Iterator it = Server.vect.iterator(); public ServerThread(Socket conect, int num){ this.conect=conect; this.num=num; } public void run (){ try{ reception= new BufferedReader( new InputStreamReader( conect.getInputStream()) ); envoi = new PrintWriter( new BufferedWriter( new OutputStreamWriter( conect.getOutputStream())), true); //reception du pseudo du client msgp = reception.readLine(); //association du pseudo et de la socket correspondant au client; Server.map.put(msgp,this.conect); //traitement de la communication entre le serveur et les clients (emetteur/recepteur) this.communiquer(); }catch (Exception e){ System.out.println(e); } } public void communiquer(){ while(true){ try{ msg=reception.readLine(); String expediteur,destinataire,message; destinataire=""; expediteur=""; message=""; int i=0; while (msg.charAt(i)!=','){ expediteur=expediteur+msg.charAt(i); i++; } i++; while(msg.charAt(i)!=','){ destinataire = destinataire+msg.charAt(i); i++; } if (destinataire.equals("")){ envoi.println("fin"); reception.close(); conect.close(); break; }else{ i++; while(i<msg.length()){ message=message+msg.charAt(i); i++; } if (Server.map.containsKey(destinataire)){ Socket socdest = Server.map.get(destinataire); PrintWriter envoidest = new PrintWriter( new BufferedWriter( new OutputStreamWriter( socdest.getOutputStream())), true); envoidest.println("Message de "+expediteur+" : "+message); envoi.println("Message envoye a : "+destinataire+" : "+message); }else{ envoi.println("L utilisateur "+destinataire+" n est pas conecte"); } } }catch(Exception e){ System.out.println(e); } } } }
Partager