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");
    }
}
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;
}
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
-->ThreadConnexionObject::ThreadConnexionObject
<--ThreadConnexionObject::ThreadConnexionObject
-->ThreadConnexionObject::run
ThreadConnexionObject::run Nouvel objet
Fermeture de la connexion objet : java.io.EOFException
<--ThreadConnexionObject::run
Pensez-vous que cette exception puisse être la cause de lenteurs ? Avez-vous une autre idée sur des raisons possibles ?

Merci d'avance pour votre précieuse aide