Bonjour,
J'ai développé un client/serveur multi-thread qui marchait plutôt bien et tout d'un coup, j'ai des comportements bizarres (réponse très longue de la part du serveur, gel des clients (sans doute lié à un attente de réponse du serveur), ...) sans que j'arrive à en déterminer la cause. Et cela correspond à l'apparition d'une exception java.io.EOFException côté serveur
Le serveur ouvre une socket pour le trasnfert des objets serialisés. Lorsqu'un client se déconnecte, la cloture de la connexion lève une exception dont je ne trouve pas la cause![]()
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 import java.net.*; import java.io.*; public class MyServer { public static void main(String[] args) { // On ouvre le server aux connexions new MultipleConnexionObject().start(); while (true) { try { Thread.sleep(100); } catch (Exception e) { System.err.println(e); } } } } class MultipleConnexionObject extends Thread { private ServerSocket _service; public MultipleConnexionObject() { try { _service = new ServerSocket(4814); } catch (Exception e) { System.out.println(e); } } public void run() { while (true) { try { Socket connexion = _service.accept(); new ThreadConnexionObject(connexion).start(); } catch (Exception e) { System.out.println(e); } } } } class ThreadConnexionObject extends Thread { private Socket _connexion; public ThreadConnexionObject(Socket connexion) { System.out.println("-->ThreadConnexionObject::ThreadConnexionObject"); try { this._connexion = connexion; } catch (Exception e) { System.err.println(e); } System.out.println("<--ThreadConnexionObject::ThreadConnexionObject"); } public void run() { System.out.println("-->ThreadConnexionObject::run"); try { ObjectInputStream in = new ObjectInputStream(_connexion.getInputStream()); ObjectOutputStream out = new ObjectOutputStream(_connexion.getOutputStream()); boolean arrêter = false; while (!arrêter) { System.out.println("ThreadConnexionObject::run Nouvel objet"); Object obj = in.readObject(); if (obj == null) arrêter = true; else { Object answer = ""; out.writeObject(answer); out.flush(); } } in.close(); out.close(); _connexion.close(); } catch (WriteAbortedException eWAE) { System.err.println(eWAE.getMessage()); } catch (Exception e) { System.err.println("Fermeture de la connexion objet : "+e); } System.out.println("<--ThreadConnexionObject::run"); } }Et voici les traces générées par le 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
51
52
53
54
55 import java.io.*; import java.net.Socket; public class MyClient { public static void main(String[] args) { // On va récupérer dans le fichier d'options l'adresse et le port try { _socketObject = new Socket("127.0.0.1", 4814); _objectOut = new ObjectOutputStream(_socketObject.getOutputStream()); _objectIn = new ObjectInputStream(_socketObject.getInputStream()); } catch (Exception e) { System.out.println(e); } // Fermeture des flux et sockets // *********************************************************************************************** try { _objectIn.close(); } catch (Exception e1) { System.out.println("Fermeture de objectIn : "+e1); } try { _objectOut.close(); } catch (Exception e1) { System.out.println("Fermeture de objectOut : "+e1); } try { _socketObject.close(); } catch (Exception e1) { System.out.println("Fermeture des sockets : "+e1); } } private static Socket _socketObject; private static ObjectInputStream _objectIn; private static ObjectOutputStream _objectOut; }
Pensez-vous que cette exception puisse être la cause de lenteurs ? Avez-vous une autre idée sur des raisons possibles ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 -->ThreadConnexionObject::ThreadConnexionObject <--ThreadConnexionObject::ThreadConnexionObject -->ThreadConnexionObject::run ThreadConnexionObject::run Nouvel objet Fermeture de la connexion objet : java.io.EOFException <--ThreadConnexionObject::run
Merci d'avance pour votre précieuse aide
Partager