[Socket][Client/Server]Exception d'origine inconnue
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 :cry:
Code:
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:
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:
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
Re: [Socket][Client/Server]Exception d'origine inconnue
Pour commencer je vois pas pkoi tu fais ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
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);
}
}
}
} |
Ta boucle while(true) je ne vois pas a koi elle sert !!! Ceci ca suffit:
Code:
1 2 3 4 5 6 7 8 9 10
|
public class MyServer
{
public static void main(String[] args)
{
// On ouvre le server aux connexions
new MultipleConnexionObject().start();
}
} |
et pour faire encore mieux fais comme ca:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public class MyServer
{
private ServerSocket _service;
public static void main(String[] args)
{
try
{
_service = new ServerSocket(4814);
while (true)
{
Socket connexion = _service.accept();
new ThreadConnexionObject(connexion).start();
}
catch (Exception e) {}
}
} |
comme ca tu n'a plus besoin de la class MultipleConnexionObject