Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/09/2008, à 11:31

Kranagard

[java]ObjectIn/outputStream dans une boucle

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:

try
        {
            //debut du jeu
            ObjectOutputStream os1 = new ObjectOutputStream(socket1.getOutputStream());
            ObjectOutputStream os2 = new ObjectOutputStream(socket2.getOutputStream());
            
            //envois aux clients des robots choisi
            os1.writeObject(mess);
            os2.writeObject(mess);
            
            
            
            //lancer les thread robots 
            Thread r1 = new Thread(robots.getRobot(1));
            Thread r2 = new Thread(robots.getRobot(2));
            r1.start();
            r2.start();
            s = new Synchronize();
            while(robots.getRobot(1).getVie()>0 && robots.getRobot(2).getVie()>0)
            {
                s.attendreEvnt();//attente d'un evenement
                mess.setRobots(robots.getRobot(1), robots.getRobot(2));
                os1.writeObject(mess);
                os2.writeObject(mess);
            }
        }
        catch (IOException ex) 
        {
            System.out.println(ex);
            System.exit(-1);
        }

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:

   //recuperation des deux robots choisi
        is = new ObjectInputStream(socket.getInputStream());
           
        mess = (Message) is.readObject();
        panelRobot1.setRobot(mess.getRobot(1)); //panelRobot 1 et 2 sont des Jpanel contenant tout ce qu'il faut
        panelRobot2.setRobot(mess.getRobot(2)); //pour que ça affiche vie, armure...
        mess.getRobot(1).Dessine(robot1); //je parametre la taille, couleur et position de 
        mess.getRobot(2).Dessine(robot2); //l'element representant les personnages
               
        setVisible(true);
        //mise a jour des données en permanence

        while(mess.getRobot(1).getVie()>0 && mess.getRobot(2).getVie()>0)//tant que les deux sont en vie
        {
            mess = (Message) is.readObject();//recuperation du message
            mess.getRobot(1).Dessine(robot1);
            panelRobot1.setRobot(mess.getRobot(1));
            mess.getRobot(2).Dessine(robot2);
            panelRobot2.setRobot(mess.getRobot(2));
            this.repaint();
            
        }

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.

Hors ligne

#2 Le 30/09/2008, à 11:57

alexduf

Re : [java]ObjectIn/outputStream dans une boucle

tu es passé en debug pour savoir si ton message était bon avant le os1.writeObject(mess); ?

Hors ligne

#3 Le 30/09/2008, à 14:03

Kranagard

Re : [java]ObjectIn/outputStream dans une boucle

il l'est, c'est justement ça mon probleme hmm

apres tests je me suis rendu compte que mon serveur tournait reellement bien (maintenant j'en suis sur) et que le client detecte bien le fait qu'il n'y a plus de message dans le flux.
mais il continue a lire toujours le meme message alors que le serveur a une struct message coherente au moment du writeObject(mess)

Dernière modification par Kranagard (Le 30/09/2008, à 17:22)

Hors ligne

#4 Le 02/10/2008, à 13:57

alexduf

Re : [java]ObjectIn/outputStream dans une boucle

je ne vois pas vraiment
Il faudrait le code original, avec toutes les déclarations de variables (locales, de classe et tout et tout) si ce n'est pas trop volumineux.
Parce que la logique me semble tout ce qu'il y a de plus correcte !

Hors ligne

#5 Le 02/10/2008, à 22:00

Kranagard

Re : [java]ObjectIn/outputStream dans une boucle

j'ai pas mal revu mon code mais j'ai toujours le meme probleme...
je fais un println sur le serveur apres l'envois d'un message pour verifier ce qui a ete envoyé et sur le client a chaque reception pour voir ce qui a ete recu et j'ai bien ça:

serveur a écrit :

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 a écrit :

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
...

le code n'est vraiment pas long si on cherche quelque chose de precis vu qu'il est tres reparti et modulé mais si tu veux tout le serveur+tout le client ça va etre un peu long je pense hmm


en resumé ça donne ça:

le Client:

    private Socket socket;
    public static OutputStream os;
    public static ObjectInputStream is;

    public void fct()
    {
            FenConnection connect = new FenConnection();
            socket = connect.getSocket();
            connect.dispose();
        try
        {
            os = socket.getOutputStream();
            is = new ObjectInputStream(socket.getInputStream());
        }
        catch (IOException ex) 
        {
            System.exit(-1);
        }
        new FenChoixRobot();
        
        new FenGame();
    }

la fenetre de jeu:

    public FenGame() {
        super(new java.awt.Frame(), true);
        initComponents();
        try {

            //recuperation des deux robots choisi
            mess = (Message) Client.is.readObject();
            panelRobot1.setRobot(mess.getRobot(1));
            panelRobot2.setRobot(mess.getRobot(2));
            mess.getRobot(1).Dessine(robot1);
            mess.getRobot(2).Dessine(robot2);
            Synchronize s = new Synchronize();
            Thread t1 = new Thread(new RafFenGame(s));
            t1.start();
            setVisible(true);
            s.attendreEvnt();
            //afficher le winner
        }

RafFenGame, qui recupere les messages et refresh les panels:

public void run() {
        
        while(FenGame.mess.getRobot(1).getVie()>0 && FenGame.mess.getRobot(2).getVie()>0)
        {
            
                System.out.println("attente d'un message");
                FenGame.mess = (Message) Client.is.readObject();
                System.out.println("Joueur 1:\n\tvie: "+FenGame.mess.getRobot(1).getVie()+"\n\tposition: "+FenGame.mess.getRobot(1).getPosition().getX()+"-"+FenGame.mess.getRobot(1).getPosition().getY());
                System.out.println("Joueur 2:\n\tvie: "+FenGame.mess.getRobot(2).getVie()+"\n\tposition: "+FenGame.mess.getRobot(2).getPosition().getX()+"-"+FenGame.mess.getRobot(1).getPosition().getY());
                
                //mess.getRobot(1).Dessine(robot1);
                FenGame.panel1.setRobot(FenGame.mess.getRobot(1));
                //mess.getRobot(2).Dessine(robot2);
                FenGame.panel2.setRobot(FenGame.mess.getRobot(2));
                
            }

le serveur:

    public static VectorRobot robots;
    public static Synchronize s,s1;
    private ObjectOutputStream os1,os2;


    public void fct() 
    {
        InitConnect conn1;
        InitConnect conn2;
        robots = new VectorRobot();
        s1 = new Synchronize();
        Propertie prop = new Propertie("Properties"+File.separator+"serveur");
        prop.loadPropertie();
        
        //attente de demande de connection
 		System.out.println("attente de connectrion\n");
        ServerSocket ecoute;
        
            ecoute = new ServerSocket(18000);
            Thread t1 = new Thread(conn1 = new InitConnect(ecoute,1));
            t1.start();
            Thread t2 = new Thread(conn2 = new InitConnect(ecoute,2));
            t2.start();
            s1.attendreEvnt();
            s1.attendreEvnt();
            robots.add((robotPort) conn1.robot.elementAt(0));
            robots.add((robotPort) conn2.robot.elementAt(0));
            os1 = conn1.os;
            os2 = conn2.os;

        Message mess = new Message();
        mess.setRobots(robots.getRobot(1),robots.getRobot(2));


            os1.writeObject(mess);
            os2.writeObject(mess);
            
            
            
            //lancer les thread robots 
            Thread r1 = new Thread(robots.getRobot(1));
            Thread r2 = new Thread(robots.getRobot(2));
            r1.start();
            r2.start();
            s = new Synchronize();
            while(robots.getRobot(1).getVie()>0 && robots.getRobot(2).getVie()>0)
            {
                s.attendreEvnt();
                mess.setRobots(robots.getRobot(1), robots.getRobot(2));
                os1.writeObject(mess);
                os2.writeObject(mess);
                System.out.println("envois d'un evenement");
                System.out.println("Joueur 1:\n\tvie: "+mess.getRobot(1).getVie()+"\n\tposition: "+mess.getRobot(1).getPosition().getX()+"-"+mess.getRobot(1).getPosition().getY());
                System.out.println("Joueur 2:\n\tvie: "+mess.getRobot(2).getVie()+"\n\tposition: "+mess.getRobot(2).getPosition().getX()+"-"+mess.getRobot(1).getPosition().getY());
                
            }
    }

je comprends vraiment pas mais je suis persuadé que c'est un tit detail dans un coin qui genere ce probleme sad

Hors ligne

#6 Le 03/10/2008, à 18:37

alexduf

Re : [java]ObjectIn/outputStream dans une boucle

Décidément je ne vois pas d'où peut bien venir le problème... hmm

Hors ligne

#7 Le 03/10/2008, à 22:07

Kranagard

Re : [java]ObjectIn/outputStream dans une boucle

j'ai posté sur plusieurs forum mais je n'ai toujours pas de reponse non plus, je vois vraiment pas ce qui ne va pas, j'ai beau faire et refaire le tour en recodant au passage pour simplifier ou optimiser le code j'ai toujours le meme probleme sad

[EDIT]
je viens de penser a quelquechose, mes objets robots sont des thread qui tournent en arriere plan, ça pourrait peut etre venir du fait qu'ils ne sont pas const ou qu'ils sont inblocable par mutex ou autre non?
j'vais tester ça je reviens.

[EDIT2]
ça change rien... sauf que maintenant je ne passe plus les robots en parametre mais juste quelques int, Point... c'est pas forcement plus beau mais c'est beaucoup plus souple sur le client du coup smile

Dernière modification par Kranagard (Le 03/10/2008, à 23:39)

Hors ligne