Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1272 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1374854
Atropos
Peace Love Death Metal
Posté le 25-05-2006 à 12:24:51  profilanswer
 

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
mood
Publicité
Posté le 25-05-2006 à 12:24:51  profilanswer
 

n°1374858
darklord
You're welcome
Posté le 25-05-2006 à 12:31:30  profilanswer
 

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

n°1374860
Atropos
Peace Love Death Metal
Posté le 25-05-2006 à 12:36:15  profilanswer
 

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 :??:

n°1375579
Atropos
Peace Love Death Metal
Posté le 26-05-2006 à 14:53:36  profilanswer
 

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 :(

n°1375623
boulax
Inserer phrase hype en anglais
Posté le 26-05-2006 à 16:05:01  profilanswer
 

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.
n°1375645
Atropos
Peace Love Death Metal
Posté le 26-05-2006 à 16:48:30  profilanswer
 

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  :??:

n°1375692
Atropos
Peace Love Death Metal
Posté le 26-05-2006 à 18:13:41  profilanswer
 

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

n°1377984
lascorie
.....
Posté le 31-05-2006 à 10:59:12  profilanswer
 

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

n°1384740
darklord
You're welcome
Posté le 09-06-2006 à 16:51:04  profilanswer
 

:heink:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[Java] expression régulière : extraction à partir d'un motif[Résolu] Appel de destructeur après avoir utilisé une dll
Probleme lors mise a jour de textarea : encodage ?problème de conception de graphiques dans une page jsp
probleme de boucleProblème de décalage sur une page
Securisation d'un script de listage de fichiers [resolu]probleme Postgresql 8 et PHP5
[RÉSOLU] Nom de fonction non reconnu[SWT] Problème d'affichage de texte
Plus de sujets relatifs à : [Java] Problème échanges client-serveur (Résolu)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR