Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme thread

envoi et reception

Sujet résolu
    19 mars 2010 à 17:01:48

    Bonjour a vous tous!

    Apres bien des heures passées sur ce site a suivre les tutos,je décide de franchir le cap et de m'inscrire ici ^^

    Bon evidemment, j'ai un léger souci avec un projet perso.
    JE vous explique tout ça comme je peux

    J'ai une classe Utilisatrice, une classe Partie(oui je fais un jeu ^^) qui hérite de thread, et une classe serveur (j'ai plus de classes que ça mais pour mon problème elles sont inutiles).

    Donc ce que je veux faire, c'est pouvoir que 2 joueurs puissent se connecter a un serveur(le serveur est le premier joueur connecté) et vu que c'est un jeu au tour par tour (en gros un jeu de dames mais avec des régles différentes) je veux que le joueur qui a joué puisse envoyer les données a l'autre.

    Seulement j'ai un léger souci ^^ lors de l'execution du run() de la classe Partie je dois récuperer un int qui permet selon sa valeur d'executer l'une ou l'autre des méthodes de partie, seulement ce int est toujours a 0 et je ne vois pas le probleme.
    voici les parties de codes mises en causes:
    classe Utilisatrice
    Serveur s = new Serveur(22);
    Partie c1 = new Partie();
    Partie c = new Partie();
    s.execution();
    c1.connexionserver();
    c1.start();
    //Ici tout le code du jeu 
    
    
    j = 3;
    s.envoyercpt(j);
    


    ici la classe Partie
    int cpt=0;
    Thread thread = new Thread(this);
    	Socket s = null;
    public synchronized void connexionserver() {
    		try {
    			s = new Socket("127.0.0.1", 22);
    		} catch (IOException ioe) {
    			System.out.println("erreur");
    
    		}
    		System.out.println("connexion effectuée");
    	}
    public synchronized void recevoirmessage() {
    
    		ObjectInputStream entree = null;
    		int i = 0;
    		Object temp;
    		try {
    			entree = new ObjectInputStream(s.getInputStream());
    			try {
    				temp = entree.readObject();
    					i=(Integer)temp;
    					System.out.println(i);
    				}
    
    				this.cpt = i;
    
    			}catch (IOException e) {
    
    				e.printStackTrace();
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    
    			System.out.println("erreur reception");
    		}catch (NullPointerException j){
    		} catch (IOException ioe) {
    			System.out.println("erreur reception");
    		}
    
    		System.out.println("message reçue");
    
    	}
    
    public void run() {
    while(isAlive()){
    		this.recevoirmessage();
    
    		/*
    		 * while (cpt==0) { try {
    		 * 
    		 * thread.wait(); } catch (InterruptedException e) { // TODO
    		 * Auto-generated catch block e.printStackTrace(); }
    		 * this.recevoirmessage(); }
    		 */
    		System.out.println("cpt" + cpt);
    		System.out.println("test1");
    
    		System.out.println("cpt : " + cpt);
    
    		if (cpt == 1){
    			this.recevoirCoup();
    		}
    		if (cpt == 3) {
    			this.envoyerCoup();
    		}
    
    		if (cpt == 2) {
    			this.fermerconnec();
    		}
    	}
    

    et enfin la classe Server
    public class Serveur {
    	int port = 22;
    	ServerSocket s;
    	Socket soc;
    
    
    	public Serveur(int port) {
    		try {
    			s = new ServerSocket(port);
    			if (s == null)
    				System.out.print("erreur");
    		} catch (IOException ioe) {
    			System.out.println("erreur");
    		}
    		System.out.println("Socket crée");
    	}
    
    	public void execution() {
    		try {
    			soc = s.accept();
    			if (soc == null)
    				System.out.print("erreur accept");
    		} catch (IOException ioe) {
    			System.out.println("erreur accept");
    		}
    		System.out.println("Socket accepté");
    	}
    
    	public void envoyercpt(int cpt) {
    		System.out.println("envoyercpt");
    		ObjectOutputStream objout = null;
    		try {
    			System.out.println("teste envoi cpt " + cpt);
    			objout = new ObjectOutputStream(soc.getOutputStream());
    			objout.writeInt(cpt);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    



    Alors si vous trouvez pourquoi ce cpt de partie ne change pas de valeur je suis preneur ^^ et oui je débute en thread :)


    merci d'avance a tous
    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2010 à 17:56:05

      bonsoir
      je ne jamais fait de communication sur le reseau du coup je ne suis pas trop sur de moi
      j'ai quelques questions:
      lors de ton
      temp = entree.readObject();
      i=(Integer)temp;
      System.out.println(i);
      

      Quel est le résultat de i ?
      (Au passage System.out.println("i = " + i); serait plus clair ;) )


      A et aussi :
      } catch (IOException ioe) {
      			System.out.println("erreur");
      
      		}
      

      tu oublies de suite

      ca confirme ce que je disais dans un autre sujet les try catch sont quasi tout le temps useless (bon là je provoque un peu :p )
      Clairement ca ne s'utilise pas comme ça et surtout tu ne catch pas pour ensuite laisser continuer ton programme, tu es sur que ca va merder dans la suite.
      La preuve jamais tu vérifies si tes variables sont null, tu considères à chaque fois que ca va bien se passer.
      Donc laisse les exceptions remonter.


      Je m'y connais pas trop en thread, mais vu que tu fais un synchronised sur ta reception, ne doit-il pas y avoir une émission synchronisé également?
      • Partager sur Facebook
      • Partager sur Twitter
        19 mars 2010 à 18:17:34

        pour le i justement c'est la mon probleme je n'ai jamais de valeur apres la ligne
        entree = new ObjectInputStream(s.getInputStream());
        


        donc le print i ne s'effectue pas.


        et pour les try catch je suis obligé de les mettre sinon eclipse veut pas compiler...
        • Partager sur Facebook
        • Partager sur Twitter
          19 mars 2010 à 18:27:29

          Citation

          et pour les try catch je suis obligé de les mettre sinon eclipse veut pas compiler...


          Là tu vas me faire le plaisir de te tapper les doigts avec une bonne règle :p

          Non tu n'est pas obligé, tu fais remonter les exception!
          exemple :
          public synchronized void connexionserver() throws IOException {
          ...
          }


          Citation

          pour le i justement c'est la mon probleme je n'ai jamais de valeur apres la ligne


          C'est à dire?
          l'appli plante et s'arrête sans rien faire (regarde le petit carré rouge de éclipse)
          l'appli plante et marque "erreur"
          l'appli fait une boucle infini
          • Partager sur Facebook
          • Partager sur Twitter
            19 mars 2010 à 18:30:34

            ah ok je savais pas, j'y vais pour la punition alors ^^"

            sinon l'appli fait une boucle infinie
            • Partager sur Facebook
            • Partager sur Twitter
              19 mars 2010 à 18:39:37

              ouai du coup faudrai vérifier comment marche le synchronised :D
              Là je sèches, j'ai jamais utilisé ceci.
              Je fais qu'à coup de mutex :D
              • Partager sur Facebook
              • Partager sur Twitter
                19 mars 2010 à 18:47:14

                Non mais lol ton problème à rien avoir avec les threads. Si tu lances un serveur et qu'il attend une connexion, faudrait peut-être que ca soit un autre programme ou un autre thread qui se connecte au serveur.
                Parce que là tu attends une connexion et tu ne la fait jamais.
                Ton programme n'est pas dans une boucle infinie je sais pas d'où tu sorts ca, il est simplement bloqué dans l'attente d'une connexion
                • Partager sur Facebook
                • Partager sur Twitter
                  19 mars 2010 à 19:01:12

                  oui ok mais la connexion je veux la faire apres. comment je peux changer dans ma méthode pour executer selon le cpt?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 mars 2010 à 19:25:28

                    cpt?

                    Y a un tuto sur les socket tu devrais le suivre, mais ca devrait être évident que tu lances deux programmes différents, un pour le serveur et un pour l'autre.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 mars 2010 à 19:29:58

                      oui j'ai pas précisé mais je le fais ça lancer 2 programmes, un qui heberge et l'autre qui execute seulement.
                      Dans le jeu c'est le joueur 1 qui heberge par défaut.
                      le problème c'est juste l'envoi dans envoyercpt(int cpt) dans le server il envoit bien mais je n'ai jamais l'affectation dans Partie
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 mars 2010 à 20:11:43

                        Précision ou pas quand je vois ca : Serveur s = new Serveur(22);
                        Partie c1 = new Partie();
                        Partie c = new Partie();
                        s.execution();
                        c1.connexionserver();
                        c1.start();

                        Je me demande comment fais pour avoir un client et un serveur, parce que là je vois un serveur qui va se transforme en client dès qu'il recoit une connexion
                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 mars 2010 à 20:38:22

                          avoir un server distant ou un client qui fait client/server c'est pas genant si?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 mars 2010 à 17:05:35

                            c'est bon j'ai trouvé j'ai simplifié mon code, merci quand meme les gens :p
                            • Partager sur Facebook
                            • Partager sur Twitter

                            probleme thread

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown