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

  FORUM HardWare.fr
  Programmation
  Java

  [java]ObjectIn/outputStream dans une boucle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[java]ObjectIn/outputStream dans une boucle

n°1794122
kranagard
Posté le 30-09-2008 à 22:35:01  profilanswer
 

je suis en train de développez un "jeu de programmeur".
en fait j'ai un serveur en java lançant deux Thread étant les personnages créé par les joueurs (en fait il faut surcharger une méthode pour créer son perso.
 
enfin bref, tout se passe sur le serveur et celui ci envois les valeurs aux clients a chaque mise a jour de celles ci:
 

Code :
  1. try
  2.         {
  3.             //debut du jeu
  4.             ObjectOutputStream os1 = new ObjectOutputStream(socket1.getOutputStream());
  5.             ObjectOutputStream os2 = new ObjectOutputStream(socket2.getOutputStream());
  6.            
  7.             //envois aux clients des robots choisi
  8.             os1.writeObject(mess);
  9.             os2.writeObject(mess);
  10.            
  11.            
  12.            
  13.             //lancer les thread robots  
  14.             Thread r1 = new Thread(robots.getRobot(1));
  15.             Thread r2 = new Thread(robots.getRobot(2));
  16.             r1.start();
  17.             r2.start();
  18.             s = new Synchronize();
  19.             while(robots.getRobot(1).getVie()>0 && robots.getRobot(2).getVie()>0)
  20.             {
  21.                 s.attendreEvnt();//attente d'un evenement
  22.                 mess.setRobots(robots.getRobot(1), robots.getRobot(2));
  23.                 os1.writeObject(mess);
  24.                 os2.writeObject(mess);
  25.             }
  26.         }
  27.         catch (IOException ex)
  28.         {
  29.             System.out.println(ex);
  30.             System.exit(-1);
  31.         }


message étant une structure contenant deux robots et la méthode getRobot(int)
les robots débloquant l'attente grace a un notify()
 
le client recupere les valeurs envoyé de tel manière:
 

Code :
  1. //recuperation des deux robots choisi
  2.         is = new ObjectInputStream(socket.getInputStream());
  3.          
  4.         mess = (Message) is.readObject();
  5.         panelRobot1.setRobot(mess.getRobot(1)); //panelRobot 1 et 2 sont des Jpanel contenant tout ce qu'il faut
  6.         panelRobot2.setRobot(mess.getRobot(2)); //pour que ça affiche vie, armure...
  7.         mess.getRobot(1).Dessine(robot1); //je parametre la taille, couleur et position de  
  8.         mess.getRobot(2).Dessine(robot2); //l'element representant les personnages
  9.              
  10.         setVisible(true);
  11.         //mise a jour des données en permanence
  12.         while(mess.getRobot(1).getVie()>0 && mess.getRobot(2).getVie()>0)//tant que les deux sont en vie
  13.         {
  14.             mess = (Message) is.readObject();//recuperation du message
  15.             mess.getRobot(1).Dessine(robot1);
  16.             panelRobot1.setRobot(mess.getRobot(1));
  17.             mess.getRobot(2).Dessine(robot2);
  18.             panelRobot2.setRobot(mess.getRobot(2));
  19.             this.repaint();
  20.            
  21.         }


voila en gros le code épuré des try/catch et autre.
maintenant mon problème:
 
le serveur envois bien l'objet message contenant les bonnes données mais le client reçoit toujours les mêmes données, le jeu évolue sur le serveur comme il faut mais reste figé sur les clients.

mood
Publicité
Posté le 30-09-2008 à 22:35:01  profilanswer
 

n°1795633
kranagard
Posté le 04-10-2008 à 15:09:08  profilanswer
 

personne n'a d'idée? :(

n°1795842
lasnoufle
La seule et unique!
Posté le 05-10-2008 à 22:25:16  profilanswer
 

kranagard a écrit :

personne n'a d'idée? :(


Salut,

 

J'utilise peu ces objets mais à vue de nez ya rien de choquant, ca devrait marcher comme ca. Quelques trucs que je vérifierais mais je suppose que t'as déjà du le faire:
- Tu dis que le client recoit toujours les memes données, t'en es sur, t'as débuggué ca?
- Tu dis que le client rafraichit pas, t'es sur qu'il rentre dans ta boucle while?
- Tu fais un this.repaint(), t'es sur que tes deux panels sont bien liés et que le repaint va jusqu'à eux?

 

Sinon tes objets robot1 et robot2 c'est quoi exactement?
Fais péter les réponses, c'est typiquement le genre de truc qui me ferait bien chier, donc si je peux savoir maintenant ce qui merde ca pourra me servir plus tard peut-etre.

 

Edit: Comment les clients envoient les données au serveur?


Message édité par lasnoufle le 05-10-2008 à 22:29:34
n°1795861
kranagard
Posté le 05-10-2008 à 23:30:53  profilanswer
 

j'ai debuggé le serveur et le client, j'ai aussi fais des println avant, apres l'envois du serveur et dans ma boucle sur le client.
 
le client passe bien dans la boucle et passe bien sur le read mais l'affichage du message reçu montre qu'il n'est pas bon. meme si a chaque passage dans la boucle je créé un  nouvel objet grace a un vector de message.
 
le repaint je l'ai rajouté par la suite, je ne suis pas sur de sa portée reel encore mais de toute façon le message reçu, testé en debbug et en affichage consol, cela montre que de toute façon la struct ne contient pas les bonnes valeurs:
serveur:

Citation :

radar de 1
deplacement de 1
envois d'un evenement
Joueur 1:
        vie: 100
        position: 15.0-13.0
Joueur 2:
        vie: 100
        position: 580.0-13.0
radar de 1
deplacement de 1
envois d'un evenement
Joueur 1:
        vie: 100
        position: 20.0-16.0
Joueur 2:
        vie: 100
        position: 580.0-16.0
...


 
client:

Citation :

attente d'un message
Joueur 1:
        vie: 100
        position: 10.0-10.0
Joueur 2:
        vie: 100
        position: 580.0-10.0
attente d'un message
Joueur 1:
        vie: 100
        position: 10.0-10.0
Joueur 2:
        vie: 100
        position: 580.0-10.0
...


 
mes objets robos1 et robot2 contiennent juste une methode run mais etend une classe robot qui contient plusieurs valeur comme la vie, l'armure, la position, le nom, la couleur... ainsi que les methodes necessaire a leurs traitement.
 
me disant que mon thread ne pouvait peut etre pas etre serialisé j'ai changé mon message et donc mon serveur:
 

Code :
  1. mess.setRobots(1,robots.getRobot(1).getNom(),robots.getRobot(1).getVie(), robots.getRobot(1).getArmure(),robots.getRobot(1).getCouleur(),robots.getRobot(1).getPosition());
  2.         mess.setRobots(2,robots.getRobot(2).getNom(),robots.getRobot(2).getVie(), robots.getRobot(2).getArmure(),robots.getRobot(2).getCouleur(),robots.getRobot(2).getPosition());


 
au lieu de  mess.setRobots(robots.getRobot(1), robots.getRobot(2));
 
comme ça j'ai un objet sans methode tournant ou quoi que se soit. mon message est bon a l'envois mais mauvais a la reception et si je redirige le flux sur un fichier au lieu du objectoutputstream le message est effectivement bon.
 
le client n'envois qu'une valeur au serveur: un int grace a un outputstream. et la valeur est bien reçu par le serveur.


Message édité par kranagard le 09-10-2008 à 18:29:55
n°1796390
lasnoufle
La seule et unique!
Posté le 06-10-2008 à 22:42:13  profilanswer
 

Bah désolé alors, je vois vraiment pas ce qui cloche...
A vue de nez, j'aurais dit que t'aurais ptetre besoin de faire un "flush" ou un truc dans le genre juste après avoir lu ton objet côté client (même si vu l'API on dirait pas qu'on en a besoin). Ca fait quoi aussi si tu fais un close et un nouveau ObjectInputStream à chaque passage de ta boucle? Oui c'est bourrin mais faut bien essayer ce qu'on peut.
Sinon, as-tu vérifié que l'adresse de ta variable mess change bien avant et après l'appel au stream.getObject?

n°1796408
kranagard
Posté le 06-10-2008 à 23:14:33  profilanswer
 

ah bonne idée de test tiens, je test ça demain s'il pleut (sinon j'suis pas la) et poste les resultats.
merci pour tes idées en tout cas, meme si pour le moment je ne trouve pas ça me permet au moins de decouvrir pas mal de choses a tester, je finirai bien par trouver comme ça :)

n°1797965
kranagard
Posté le 09-10-2008 à 18:28:43  profilanswer
 

serveur:

Code :
  1. while(robots.getRobot(1).getVie()>0 && robots.getRobot(2).getVie()>0)
  2.             {
  3.                 s.attendreEvnt();
  4.                 mess= new Message();
  5.                 mess.setRobots(1,robots.getRobot(1).getNom(),robots.getRobot(1).getVie(),robots.getRobot(1).getArmure(), robots.getRobot(1).getCouleur(),robots.getRobot(1).getPosition());
  6.                 mess.setRobots(2,robots.getRobot(2).getNom(),robots.getRobot(2).getVie(),robots.getRobot(2).getArmure(), robots.getRobot(2).getCouleur(),robots.getRobot(2).getPosition());
  7.                 conn1.os.flush();
  8.                 conn2.os.flush();
  9.                 conn1.os.writeObject(mess);
  10.                 conn2.os.writeObject(mess);
  11.                 System.out.println("envois d'un evenement" );
  12.                 System.out.println("Joueur 1:\n\tvie: "+mess.getVie(1)+"\n\tposition: " + mess.getPosition(1).getX() +"-"+ mess.getPosition(1).getY());
  13.                 System.out.println("Joueur 2:\n\tvie: "+mess.getVie(2)+"\n\tposition: " + mess.getPosition(2).getX() +"-"+ mess.getPosition(2).getY());
  14.                
  15.             }


 
 
client:

Code :
  1. while(true)
  2.         {
  3.              mess = new Message();
  4.                
  5.             try
  6.             {
  7.                 System.out.println("attente d'un message" );
  8.                 mess = (Message) Client.is.readObject();
  9.                 System.out.println("Joueur 1:\n\tvie: "+mess.getVie(1)+"\n\tposition: "+mess.getPosition(1).getX() +"-"+ mess.getPosition(1).getY());
  10.                 System.out.println("Joueur 2:\n\tvie: "+mess.getVie(2)+"\n\tposition: "+mess.getPosition(2).getX() +"-"+ mess.getPosition(2).getY());
  11.                
  12.                 Dessine(rec1,mess.getPosition(1),mess.getCouleur(1));
  13.                 p1.setRobot(mess.getNom(1),mess.getVie(1),mess.getArmure(1),mess.getCouleur(1),mess.getPosition(1));
  14.                 Dessine(rec2,mess.getPosition(2),mess.getCouleur(2));
  15.                 p2.setRobot(mess.getNom(2),mess.getVie(2),mess.getArmure(2),mess.getCouleur(2),mess.getPosition(2));
  16.                 if(mess.getVie(1)<=0 || mess.getVie(2)<=0)
  17.                     break;
  18.             }
  19.             catch (IOException ex)
  20.             {
  21.                 //lancer la fenetre du winner :)
  22.                 System.out.print("r1:"+mess.getVie(1));
  23.                 System.out.print("r2:"+mess.getVie(2));
  24.        
  25.                 System.exit(0);
  26.             }
  27.             catch (ClassNotFoundException ex)
  28.             {
  29.                 System.out.println(ex);
  30.                 System.exit(-1);
  31.             }
  32.            
  33.         }


 
le client reçoit les modifications de la vie et armure, mais toujours pas des positions alors qu'elles sont envoyées en meme temp et qu'elle sont bonnes au moment de l'envois :pt1cable:  
mais ça avance :D


Message édité par kranagard le 09-10-2008 à 18:31:21
n°1797972
kranagard
Posté le 09-10-2008 à 19:04:31  profilanswer
 

ah bah voila ça fonctionne...
 
j'ai remplacé le Point dans mon message par deux int (en gardant Point comme parametre a mon set et comme retour de mon get en le decoupant et en le recreant.
 
je sais pas si Point est serializable, ça vient peut etre de la mais ça reste a verifier, si quelqu'un a une idée ça m'interesse fortement.


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

  [java]ObjectIn/outputStream dans une boucle

 

Sujets relatifs
[Java] border d'un JPanel : problème d'affichagejava
Mon swf ne boucle pas[Résolu] Problème avec une boucle
Connection mysql --> Erreur java.io.EOFExceptionproblrmr de classepath avec java sous linux
Problème avec une boucle forSortir requête SQL d'une boucle
Récupérer l'adresse MAC grace à un applet java 
Plus de sujets relatifs à : [java]ObjectIn/outputStream dans une boucle


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