[Java] Problème échanges client-serveur (Résolu)

Problème échanges client-serveur (Résolu) [Java] - Java - Programmation

Marsh Posté le 25-05-2006 à 12:24:51    

Salut,
Dans le cadre d'un projet pour mon école, je dois programmer un petit jeu réseau.
Le problème est que l'échange de données entre le client et le serveur se fait bien au début, mais dès que le serveur lance le thread s'occupant du client, la réception plante  :??:  
 
voilà le code concerné :

Code :
  1. import java.net.*;
  2. import java.io.*;
  3. class ServerListen implements Runnable
  4. {
  5. private Socket socket = null;
  6. private Donnees baseDonnee = new Donnees();
  7. private DataPlayer joueur=null;
  8. private ObjectInputStream ois = null;
  9. private ServerStream serveur=null;
  10. private ObjectOutputStream oos = null;
  11. private OutputStream os=null;
  12. private int _numClient=0;
  13. public ServerListen(Socket socket, Donnees baseDonnee, ServerStream serveur)
  14.  {
  15.   this.socket=socket;
  16.   this.baseDonnee=baseDonnee;
  17.   this.serveur=serveur;
  18.   try {       
  19.                 InputStream is = socket.getInputStream();
  20.                 ObjectInputStream ois = new ObjectInputStream(is);
  21.                 OutputStream os = socket.getOutputStream();
  22.                 ObjectOutputStream oos = new ObjectOutputStream(os);
  23.                 _numClient = serveur.addClient(oos);
  24.                
  25.                 joueur = (DataPlayer)ois.readObject();
  26.                 } catch(Exception e) {System.err.println(e);}
  27.                System.out.println("<<ok reception data joueur" );
  28.              
  29.                 serveur.sendAll(baseDonnee);
  30.                 System.err.println(">>Ok envoi database" );
  31.                
  32.                 Thread t = new Thread(this);
  33.                 t.start();
  34.  }
  35. public void run()
  36.  {
  37.   System.out.println("Connection de "+joueur.getPseudo()+" ["+_numClient+"]" );
  38.    try {
  39.     while(true)
  40.    {
  41.    joueur = (DataPlayer)ois.readObject();
  42. //##############################################################
  43.    System.out.println("<<<ok reception data joueur "+_numClient);
  44.    baseDonnee.updateClient(joueur);
  45.    serveur.sendAll(baseDonnee);
  46.    }
  47.    } catch (Exception e) {System.err.println(e);}
  48.   finally
  49.        {
  50.         try
  51.           {
  52.                 System.out.println("deconnection de ["+_numClient+"]" );
  53.           serveur.delClient(_numClient);
  54.           socket.close();
  55.           }
  56.          catch (IOException e){ }
  57.        }
  58.  }}


Voici la partie du code du serveur, il plante à l'endroit avec les '###" et envoie comme erreur  
java.lang.NullPointerException
 

Code :
  1. mport java.io.*;
  2. import java.net.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. import java.awt.event.*;
  6. class ClientListen extends Thread
  7. {
  8. DataPlayer joueur = new DataPlayer();
  9. Donnees baseDonnees=new Donnees();
  10. InputStream is = null;
  11. ObjectInputStream ois = null;
  12. OutputStream os = null;
  13. ObjectOutputStream oos = null;
  14. private Socket socket = null;
  15. public ClientListen(Socket socket, DataPlayer joueur)
  16.  {
  17.   this.socket=socket;
  18.   this.joueur=joueur;
  19.   joueur.setPseudo("prout" );
  20.  try
  21.  {
  22. os = socket.getOutputStream();
  23.         oos = new ObjectOutputStream(os);
  24. is = socket.getInputStream();
  25.         ois = new ObjectInputStream(is);
  26.        
  27.  }
  28.  catch (Exception e) {System.err.println(e);}
  29.  this.start();
  30.  }
  31. public synchronized Donnees getDonnees()
  32.  {
  33.   return baseDonnees;
  34.  }
  35. public void run()
  36.  {
  37.   System.out.println("##Ok connexion" );
  38.  try
  39.   {
  40.   while (true)
  41.    {
  42.    oos.writeObject(joueur);
  43.                          System.out.println(">>Ok envoi data joueur" );
  44. //############################################################
  45.    baseDonnees = (Donnees)ois.readObject();
  46.                                 System.out.println("<<Ok reception database" );
  47.    }
  48.   }
  49.  catch (Exception e) {System.err.println(e);}
  50.  finally
  51.   {
  52.   System.out.println("Connexion interrompue\n" );
  53.   }}}


Voilà le code du client, qui plante à l'endroit avec les '###" avec le message suivant :
java.net.SocketException: Software caused connection abort: recv failed
 
Désolé pour la longueur, et merci d'avance si vous voyez d'où peut venir mon problème  :jap:


Message édité par Atropos le 26-05-2006 à 18:14:08
Reply

Marsh Posté le 25-05-2006 à 12:24:51   

Reply

Marsh Posté le 25-05-2006 à 12:31:30    

tu es sûr de ce que tu fais avec les Object Input/Output stream là? :o

Reply

Marsh Posté le 25-05-2006 à 12:36:15    

le client envoie les données "joueur" : oos.writeObject(joueur); et reçoit les données du serveur ("baseDonnees" ) : baseDonnees = (Donnees)ois.readObject();
 
Le serveur lui fait l'inverse : il reçoit les données "joueur" et envoie aux clients les données "baseDonnees" :

joueur = (DataPlayer)ois.readObject();
serveur.sendAll(baseDonnee);

 
J'avoue que j'ai un peu de mal à saisir comment envoyer des objets, mais ça fonctionne bien une première fois, donc je ne vois pas où est mon erreur :??:

Reply

Marsh Posté le 26-05-2006 à 14:53:36    

Bon j'ai tout repris à plat et maintenant je n'ai plus de plantages :)
Par contre le premier echange se passe bien, mais dès le second le serveur ne semble pas recevoir les infos mises à jour.
En effet lorsque je tape une phrase à envoyer au serveur, si c'est la premiere il la reçoit bien mais dès la deuxieme il ré-affiche la première :/  
Voilà le nouveau code :  
 
Coté serveur :

Code :
  1. import java.net.*;
  2. import java.io.*;
  3. class ServerListen implements Runnable
  4. {
  5. private Socket socket = null;
  6. private Donnees baseDonnee = new Donnees();
  7. private DataPlayer joueur=null;
  8. private ObjectInputStream ois = null;
  9. private ServerStream serveur=null;
  10. private ObjectOutputStream oos = null;
  11. private OutputStream os=null;
  12. private int _numClient=0;
  13. public ServerListen(Socket socket, Donnees baseDonnee, ServerStream serveur)
  14.  {
  15.   this.socket=socket;
  16.   this.baseDonnee=baseDonnee;
  17.   this.serveur=serveur;
  18.            
  19.                 Thread t = new Thread(this);
  20.                 t.start();
  21.  }
  22. public void run()
  23.  {
  24.     int test=0;
  25.    try {
  26.    InputStream is = socket.getInputStream();
  27.                 ObjectInputStream ois = new ObjectInputStream(is);
  28.                 OutputStream os = socket.getOutputStream();
  29.                 ObjectOutputStream oos = new ObjectOutputStream(os);
  30.                 _numClient = serveur.addClient(oos);
  31.                 System.out.println("Connection de ["+_numClient+"]" );
  32.                                
  33.     while(true)
  34.    {
  35.    joueur = (DataPlayer)ois.readObject();
  36.    if (test==0) baseDonnee.addClient(joueur);
  37.    test=1;
  38.    baseDonnee.updateClient(joueur);
  39.    serveur.sendAll(baseDonnee);
  40.    System.out.println("["+_numClient+"] "+joueur.getPseudo()+" : "+joueur.getMessage());
  41.    System.out.println(joueur.getCoordx());
  42.    }
  43.    } catch (Exception e) {System.err.println(e);}
  44.    finally
  45.        {
  46.         try
  47.           {
  48.      
  49.           System.out.println("deconnection de ["+_numClient+"]" );
  50.           serveur.delClient(_numClient);
  51.           baseDonnee.removeClient(joueur);
  52.           socket.close();
  53.           }
  54.          catch (IOException e){System.err.println(e); }
  55.        }
  56.  }
  57. }


 
Et coté client :

Code :
  1. import java.io.*;
  2. import java.net.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. import java.awt.event.*;
  6. class ClientListen extends Thread
  7. {
  8. DataPlayer joueur = new DataPlayer();
  9. Donnees baseDonnees=new Donnees();
  10. InputStream is = null;
  11. ObjectInputStream ois = null;
  12. OutputStream os = null;
  13. ObjectOutputStream oos = null;
  14. private Socket socket = null;
  15. BufferedReader IN=null;
  16. public ClientListen(Socket socket)
  17.  {
  18.   this.socket=socket;
  19.   this.start();
  20.  }
  21. public synchronized Donnees getDonnees()
  22.  {
  23.   return baseDonnees;
  24.  }
  25. public void run()
  26.  {
  27.  String demande="";
  28.  try
  29.  {
  30.     os = socket.getOutputStream();
  31.         oos = new ObjectOutputStream(os);
  32.  is = socket.getInputStream();
  33.         ois = new ObjectInputStream(is);
  34.         IN = new BufferedReader(new InputStreamReader(System.in));
  35.        
  36.         System.out.println("Pseudo : \n" );
  37.         demande=IN.readLine();
  38.  joueur.setPseudo(demande);
  39.         demande="";
  40.  }
  41.  catch (Exception e) {System.err.println(e);}
  42.  System.out.println("##Ok connexion" );
  43.  try
  44.   {
  45.   while (true)
  46.    {
  47.     if ((demande=IN.readLine())!=null) joueur.setMessage(demande);
  48.    joueur.setCoordx(joueur.getCoordx()+1);
  49.    oos.writeObject(joueur);
  50.    baseDonnees = (Donnees)ois.readObject();
  51.    }
  52.   }
  53.  catch (Exception e) {System.err.println(e);}
  54.  finally
  55.   {
  56.   System.out.println("Connexion interrompue\n" );
  57.   }
  58.  }
  59. }


 
Voilà à mon avis il y a quelque chose que je n'ai pas compris dans les échanges entre clients et serveur en java mais je n'arrive pas à mettre le doigt dessus :(

Reply

Marsh Posté le 26-05-2006 à 16:05:01    

Tu voudrais pas essayer d'isoler un peu le probleme parce que lire tes pavés avec potentiellement 90% de code qui n'a rien a voir avec le probleme c'est lourd.  
Ca te permettrai aussi de reflechir un peu et de dérouler ton programme dans ta tete (puisque t'as pas l'air d'avoir de debugger sous la main)


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 26-05-2006 à 16:48:30    

boulax a écrit :

Tu voudrais pas essayer d'isoler un peu le probleme parce que lire tes pavés avec potentiellement 90% de code qui n'a rien a voir avec le probleme c'est lourd.  
Ca te permettrai aussi de reflechir un peu et de dérouler ton programme dans ta tete (puisque t'as pas l'air d'avoir de debugger sous la main)


 
Voilà prise isolément la partie "serveur" qui s'occupe de récupérer les infos d'un client et d'envoyer à tous les clients ses données :
 

Code :
  1. while(true)
  2.   {
  3.    joueur = (DataPlayer)ois.readObject();
  4.    baseDonnee.updateClient(joueur);
  5.    serveur.sendAll(baseDonnee);
  6.    System.out.println("["+_numClient+"] "+joueur.getPseudo()+" : "+joueur.getMessage());
  7.   }


 
et pour le Client, qui reçoit les données du serveur et envoie ses infos :
 

Code :
  1. while (true)
  2.   {
  3.                                 //Ici les données "joueur" étaient modifiées
  4.    oos.writeObject(joueur);
  5.    baseDonnees = (Donnees)ois.readObject();
  6.   }


 
Voilà et si la première boucle semble se dérouler correctement, dès la deuxième boucle on dirait que le programme envoie toujours les mêmes données  :??:

Reply

Marsh Posté le 26-05-2006 à 18:13:41    

En fait j'ai trouvé, il fallait utiliser writeUnshared au lieu de writeObject :o

Reply

Marsh Posté le 31-05-2006 à 10:59:12    

bonjour  
voila g eu les codes source d'un logiciel que je devai mettre sur pieds pour mon memoire.
mais voila:il se compose de plusieurs fichiers.
mon probleme est de pouvoir extirper l'arboressence pour la compilation
merci pour votre aide

Reply

Marsh Posté le 09-06-2006 à 16:51:04    

:heink:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed