IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[Socket][Client/Server]Exception d'origine inconnue


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut [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

    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

  2. #2
    Membre averti Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Points : 439
    Points
    439
    Par défaut Re: [Socket][Client/Server]Exception d'origine inconnue
    Pour commencer je vois pas pkoi tu fais ceci:
    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
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    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

  3. #3
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut
    Pour la boucle while, tu as raison, cela ne sert à rien dans mon exemple (cela vient de mon code complet dans lequel je fais des traitements en fin d'application que l'on ne voit pas dans mon exemple)

    Pour ta dernière solution, c'est effectivement mieux comme ça mais cela ne règle pas mon problème

  4. #4
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut
    Ca y est, je pense avoir compris : quand le client s'arrête, il ferme sa connexion et du coup le serveur reçoit la commande de fermeture et c'est cette cloture qui provoque l'exception.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Socket Client-Server ; Le client ne reçoit rien
    Par Ivelios dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 08/01/2010, 17h00
  2. [DELPHI]client/server socket envoi tchart
    Par mariachi dans le forum Web & réseau
    Réponses: 0
    Dernier message: 01/01/2009, 15h28
  3. Client/Server Socket ..
    Par Chyokyka dans le forum Débuter
    Réponses: 8
    Dernier message: 15/04/2008, 21h50
  4. client/server tcp, probleme socket
    Par Misaki dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 20/12/2007, 09h46
  5. Problème de communication socket (Client->Server)
    Par Julien_C++ dans le forum C++Builder
    Réponses: 6
    Dernier message: 21/05/2007, 21h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo