IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

probleme avec les thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut probleme avec les thread
    Bonjour tout le monde,
    Je me permet de vous poser une question apres quelques heures d'essais a essayer de faire tourner ce programme ^^

    Mon but est ici de faire un jeu en réseau en java, avec un client et un server. Le client se connecte au server et l'envoi de données se fait. J'ai donc un jeu qui fonctionne correctement, mais au moment de l'envoi j'arrive a jouer le tour du joueur 1 puis celui du 2e mais la main ne revient jamais au premier. L'envoi de données doit déconner (ou moi mal coder c'est plus probable ^^).
    Je precise que c'est ma premiere application réseau (ça se voit d'ailleurs surement).
    Les system.out.println en abondance sont des restes de mes tentatives de deboggage ^^

    Voici mon code de la classe Server
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    import java.io.*;
    import java.net.*;
     
    public class Serveur {
    	int port = 22;
    	ServerSocket s;
    	Socket soc;
    	Socket s2;
    	Coup c = new Coup();
     
    	public Coup Getcoup() {
    		return c;
    	}
     
    	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 Coup recevoirmessage() {
    		ObjectInputStream objIn = null;
    		try {
    			objIn = new ObjectInputStream(soc.getInputStream());
    		} catch (IOException ioe) {
    			System.out.println("erreur reception");
    		}
    		catch (NullPointerException e){}
    		System.out.println("message reçu");
    		try {
    			try {
    				c = (Coup) objIn.readObject();
    				System.out.println(c.getNbCaseArr());
     
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} catch (IOException ioe) {
    		}
    		catch (NullPointerException e){}
    		return c;
    	}
     
     
     
    	public void envoyermessage(Coup c) {
    		ObjectOutputStream objout = null;
    		System.out.println("message du serveur 1"+c.getNbCaseDep());
     
    		try {
    			try {
    				System.out.println("message du serveur 2"+c.getNbCaseDep());
    				objout = new ObjectOutputStream(soc.getOutputStream());
    				System.out.println("message du serveur 3"+c.getNbCaseDep());
     
    				objout.writeObject(c);
    				System.out.println("message du serveur au socket"+c.getNbCaseDep());
     
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} catch (NullPointerException e) {
     
    		}
     
    	}
    }

    La classe Client qui est une partie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    static final int port = 22;
     
    	Thread thread = new Thread(this);
    	Socket s = null;
    	int cpt = 0;
     
    	Partie(Socket _s) {
    		s = _s;
    	}
     
    	Partie(Thread t) {
    		thread.start();
    	}
     
    	Coup c;
     
    	public Coup getcoup() {
    		return c;
    	}
     
    	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 recevoirCoup() {
    		System.out.println("on rentre ici");
    		ObjectInputStream entree = null;
    		Object i = null;
    		System.out.println("1");
     
    		try {
    			System.out.println("2");
     
    			entree = new ObjectInputStream(s.getInputStream());
    		} catch (IOException ioe) {
    			System.out.println("erreur reception");
    		}
    		catch (NullPointerException e) {}
    		System.out.println("message reçue");
    		try {
    			try {
    				i = entree.readObject();
    				System.out.println("coup joué par l'autre joueur"+((Coup) i).getNbCaseDep()+":"+((Coup) i).getNbCaseArr());
     
     
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} catch (IOException ioe) {
    			System.out.println("erreur reception");
    		}
    		System.out.println("message reçue");
    		this.c = (Coup) i;
    		System.out.println(((Coup) i).getNbCaseDep());
    		this.getPlateau().deplaceJeton(c);
    		this.ajoutHistorique(c);
     
    	}
     
    	public synchronized void envoicoup(){
    		System.out.println("envoi coup ici"+ c.getNbCaseDep());
    		ObjectOutputStream objout = null;
    		try {
    			try {
    				objout = new ObjectOutputStream(s.getOutputStream());
    				System.out.println("objet joueur 2"+ c.getNbCaseDep());
    				objout.writeObject(c);
     
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} catch (NullPointerException e) {
     
    		}
    	}
     
     
     
     
    	public synchronized void run() {
    while(isAlive()){
    	System.out.println("122");
    			if (this.c==null){
    				this.recevoirCoup();
    			}
    			else{
    			this.envoicoup();
    			this.c=null;}
    			System.out.println("124");
    			System.out.println("125");
     
    			System.out.println("etat"+this.getListCoups().getLast().etat);
     
    	}

    et enfin la classe utilisatrice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    import java.io.IOException;
    import java.util.InputMismatchException;
    import java.util.Scanner;
     
    public class Utilisatrice extends Thread {
     
    	/**
             * @param args
             */
     
    	public static void main(String[] args) {
    		Scanner lectureClavier = new Scanner(System.in);
    		Partie p = new Partie();
    		int j;
    		int t = 0;
    		int dest;
    		boolean sortie = false;
    		Coup co = new Coup();
    		Coup co2;
    		int cpt =0;
    		Serveur s = new Serveur(22);
    		Thread th = null;
    		Partie c = new Partie(th);
    		Joueur j1 = new Joueur(0, "j1", 0);
    		Joueur j2 = new Joueur(0, "j2", 1);
    		c.initialiser(j1, j2);
    		co.etat = 1;
    		c.ajoutHistorique(co);
    		System.out.println(c.getPlateau().getPl());
    		System.out.println(" server s client c");
    		String str = lectureClavier.nextLine();
    		if (str.equals("s")) {
    			s.execution();
    		}
    		if (str.equals("c")) {
    			c.connexionserver();
    			c.start();
    		}
    		while (true) {
     
     
    			if ((c.getListCoups().getLast().etat == 2) && (str.equals("c"))) {
    				System.out.println(c.getPlateau().getPl());
    				System.out.println("vous etes le joueur 2 et etes client");
    				System.out.println(" joueur 2, donnez une case");
    				t = lectureClavier.nextInt();
    				System.out.println(" et sa destination");
    				dest = lectureClavier.nextInt();
    				co = new Coup(j2, t, dest);
    				co.etat = 1;
    				c.getPlateau().deplaceJeton(co);
    				c.ajoutHistorique(co);
    				s.envoyermessage(co);
    				System.out.println(c.getPlateau().getPl());
     
     
    			}
     
    			else 	if (cpt > 0) {
    				s.recevoirmessage();
    				System.out.println("cpt" + cpt);
    				System.out.println("etat" + c.getListCoups().getLast().etat);
    				System.out.println("string" + str);
    			}
     
     
     
    			if ((c.getListCoups().getLast().etat == 1) && (str.equals("s"))) {
    				System.out
    						.println("vous etes le joueur 1 et vous hebergez la partie");
    				System.out.println(" joueur 1, donnez une case");
    				t = lectureClavier.nextInt();
    				System.out.println(" et sa destination");
    				dest = lectureClavier.nextInt();
    				co = new Coup(j1, t, dest);
    				co.etat = 2;
    				c.getPlateau().deplaceJeton(co);
    				c.ajoutHistorique(co);
    				s.envoyermessage(co);
    				System.out.println(c.getPlateau().getPl());
    				cpt++;
    			}
     
    		}
     
    	}
     
    }
    Je lance 2 fois la classe utilisatrice, une fois pour le server l'autre pour le client,

    le server une fois crée attend bien le client, celui ci se connecte, la partie se lance.
    Le coup(nom de la classe que j'echange) du joueur 1 va bien a celui du joueur2, le joueur 2 joue, et la plus rien, le joueur 1 attend dans le vide.


    Si vous pouvez m'aider je vous en serai plus que reconnaissant je me décarcasse dessus depuis quelques jours ^^

    merci d'avance

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bonjour,
    c'est tout à fait normal que tu ais ce comportement.
    Ton erreur se situe au niveau des flux. A chaque fois que tu veux envoyer/recevoir un message, tu ouvres un nouvel ObjectOutput/InputStream (et que tu laisses ouvert).

    La bonne pratique est la suivante:
    - Tu créés un ObjectOutputStream, tu flush, et tu le conserves.
    - Tu créés un ObjectInputStream dans un thread à part dans lequel tu l'écoutes en boucle.
    - A chaque fois que tu veux envoyer un message, tu écrit tes données, tu flush puis tu fais un reset.
    - Quand ta connexion prend fin, tu fermes les deux flux, quoi qu'il arrive (finally).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    merci de ta réponse mais je n'ai pas tout compris..

    En fait la dans mon code il me suffit de rajouter un objout.flush() et objout.reset()??

    enfin ça doit etre plus compliqué vu que la ça ne change rien. et quand tu dis conserve le, je le stocke dans un attribut?


    désolé mais la j'ai un peu de mal ^^

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Il faut que tu rajoute ces instructions, mais en plus de ça, tu ne dois initialiser tes ObjectStream qu'une seule fois et non à chaque message.

    Pour le Output par exemple, cette instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objout = new ObjectOutputStream(soc.getOutputStream());
    Devrait se trouver dans la méthode execution, une fois que tu as la Socket, plutôt que dans envoyermessage.

    Et cela est aussi valable pour l'output du client et les input des deux.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    merci je viens d'essayer mais ça change rien du tout.... doit y'avoir un autre probleme...

  6. #6
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Tu peux nous montrer le nouveau code?

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    classe partie/client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    static final int port = 22;
     
    	Thread thread = new Thread(this);
    	Socket s = null;
    	int cpt = 0;
    	ObjectOutputStream objout = null;
    	ObjectInputStream entree = null;
     
     
     
    	Partie(Socket _s) {
    		s = _s;
    	}
     
    	Partie(Thread t) {
    		thread.start();
    	}
     
    	Coup c;
     
    	public Coup getcoup() {
    		return c;
    	}
     
    	public synchronized void connexionserver() {
    		try {
    			s = new Socket("127.0.0.1", 22);
    			objout = new ObjectOutputStream(s.getOutputStream());
    			entree = new ObjectInputStream(s.getInputStream());
     
     
    		} catch (IOException ioe) {
    			System.out.println("erreur");
     
    		}
    		System.out.println("connexion effectuée");
    	}
     
     
     
    	public synchronized void recevoirCoup() {
    		System.out.println("on rentre ici");
    		Object i = null;
    		System.out.println("1");
     
     
    		try {
    			try {
    				i = entree.readObject();
    				System.out.println("coup joué par l'autre joueur"+((Coup) i).getNbCaseDep()+":"+((Coup) i).getNbCaseArr());
     
    				System.out.println("message reçue");
    				this.c = (Coup) i;
     
    				this.getPlateau().deplaceJeton(c);
    				this.ajoutHistorique(c);
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			catch(NullPointerException e){}
    		} catch (IOException ioe) {
    			System.out.println("erreur reception");
    		}
     
     
    	}
     
    	public synchronized void envoicoup(){
    		System.out.println("envoi coup ici"+ c.getNbCaseDep());
    		try {
    			try {
    				System.out.println("objet joueur 2"+ c.getNbCaseDep());
    				objout.writeObject(c);
    				objout.flush();
    				objout.reset();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} catch (NullPointerException e) {
     
    		}
    	}
    	public synchronized void fermerconnec() {
    		try {
    			System.out.println("on ferme");
    			s.close();
    		} catch (IOException ioe) {
    			System.out.println("erreur fermeture");
    		}
    		System.out.println("fermeture");
     
    	}
     
    	public synchronized void attente(boolean b) {
    		while (b) {
    			try {
    				this.thread.wait();
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
     
     
     
    	public synchronized void run() {
    while(isAlive()){
    	System.out.println("122");
    			if (this.c==null){
    				this.recevoirCoup();
    			}
    			else{
    			this.envoicoup();
    			this.c=null;}
    			System.out.println("124");
    			System.out.println("125");
     
    			System.out.println("etat"+this.getListCoups().getLast().etat);
     
    	}
    classe serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    import java.io.*;
    import java.net.*;
     
    public class Serveur {
    	int port = 22;
    	ServerSocket s;
    	Socket soc;
    	Socket s2;
    	Coup c = new Coup();
    	ObjectOutputStream objout = null;
    	ObjectInputStream objIn = null;
     
     
     
    	public Coup Getcoup() {
    		return c;
    	}
     
    	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();
    			objout = new ObjectOutputStream(soc.getOutputStream());
    			objIn = new ObjectInputStream(soc.getInputStream());
     
     
    			if (soc == null)
    				System.out.print("erreur accept");
    		} catch (IOException ioe) {
    			System.out.println("erreur accept");
    		}
    		System.out.println("Socket accepté");
     
    	}
     
     
    	public Coup recevoirmessage() {
    		try {
    			try {
    				c = (Coup) objIn.readObject();
    				System.out.println(c.getNbCaseArr());
     
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} catch (IOException ioe) {
    		}
    		catch (NullPointerException e){}
    		System.out.println("ECHO = " + c.getNbCaseArr());
    		return c;
    	}
     
     
     
    	public void envoyermessage(Coup c) {
    		System.out.println("message du serveur 1"+c.getNbCaseDep());
     
    		try {
    			try {
    				System.out.println("message du serveur 2"+c.getNbCaseDep());
    				System.out.println("message du serveur 3"+c.getNbCaseDep());
     
    				objout.writeObject(c);
    				objout.flush();
    				objout.reset();
    				System.out.println("message du serveur au socket"+c.getNbCaseDep());
     
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} catch (NullPointerException e) {
     
    		}
     
    	}
    }
    classe utilisatrice


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
     
    import java.io.IOException;
    import java.util.InputMismatchException;
    import java.util.Scanner;
     
    public class Utilisatrice extends Thread {
     
    	/**
             * @param args
             */
     
    	public static void main(String[] args) {
    		Scanner lectureClavier = new Scanner(System.in);
    		Partie p = new Partie();
    		int j;
    		int t = 0;
    		int dest;
    		boolean sortie = false;
    		Coup co = new Coup();
    		Coup co2;
    		int cpt =0;
    		Serveur s = new Serveur(22);
    		Thread th = null;
    		Partie c = new Partie(th);
    		Joueur j1 = new Joueur(0, "j1", 0);
    		Joueur j2 = new Joueur(0, "j2", 1);
    		c.initialiser(j1, j2);
    		co.etat = 1;
    		c.ajoutHistorique(co);
    		System.out.println(c.getPlateau().getPl());
    		System.out.println(" server s client c");
    		String str = lectureClavier.nextLine();
    		if (str.equals("s")) {
    			s.execution();
    		}
    		if (str.equals("c")) {
    			c.connexionserver();
    			c.start();
    		}
    		while (true) {
     
     
    			if ((c.getListCoups().getLast().etat == 2) && (str.equals("c"))) {
    				System.out.println(c.getPlateau().getPl());
    				System.out.println("vous etes le joueur 2 et etes client");
    				System.out.println(" joueur 2, donnez une case");
    				t = lectureClavier.nextInt();
    				System.out.println(" et sa destination");
    				dest = lectureClavier.nextInt();
    				co = new Coup(j2, t, dest);
    				co.etat = 1;
    				s.envoyermessage(co);
    				System.out.println(c.getPlateau().getPl());
     
     
    			}
     
    			else 	if (cpt > 0) {
    				c.getPlateau().deplaceJeton(s.recevoirmessage());
    				System.out.println("cpt" + cpt);
    				System.out.println("etat" + c.getListCoups().getLast().etat);
    				System.out.println("string" + str);
    			}
     
     
     
    			if ((c.getListCoups().getLast().etat == 1) && (str.equals("s"))) {
    				System.out
    						.println("vous etes le joueur 1 et vous hebergez la partie");
    				System.out.println(" joueur 1, donnez une case");
    				t = lectureClavier.nextInt();
    				System.out.println(" et sa destination");
    				dest = lectureClavier.nextInt();
    				co = new Coup(j1, t, dest);
    				co.etat = 2;
     
    				s.envoyermessage(co);
    				System.out.println(c.getPlateau().getPl());
    				cpt++;
    			}
     
    		}
     
    	}
     
    }
    voili voilou

  8. #8
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Citation Envoyé par Deaf Voir le message
    La bonne pratique est la suivante:
    - Tu créés un ObjectOutputStream, tu flush, et tu le conserves.
    - Tu créés un ObjectInputStream dans un thread à part dans lequel tu l'écoutes en boucle.
    - A chaque fois que tu veux envoyer un message, tu écrit tes données, tu flush puis tu fais un reset.
    - Quand ta connexion prend fin, tu fermes les deux flux, quoi qu'il arrive (finally).
    Il reste encore pas mal de choses à respecter par rapport à cette démarche.

    De plus, il va falloir que tu revoies la manière dont tu traites les messages entrant. Tu te contentes de lire l'InputStream quand tu est en droit d'attendre une réponse provenant de l'autre (client ou serveur).
    Ce n'est pas la manière de faire, tu dois lire en boucle tant que ta connexion est ouverte, notamment pour éviter que les flux saturent.
    Pour t'en convaincre, imagine que tu arrives à faire fonctionner ce programme. Tu risque de vouloir ajouter la possibilité de dialoguer entre les joueurs et donc tu vas envoyer des String (ou un objet genre Message). Là, tu ne sauras pas quand la personne avec laquelle tu communiques est censée t'envoyer un message. Tu devras donc écouter sans cesse le flux pour avoir le dialogue "en live".

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Deaf Voir le message

    - Tu créés un ObjectInputStream dans un thread à part dans lequel tu l'écoutes en boucle.
    Je ne comprend pas ici, comment je peux changer mon code pour mettre ça sans avoir a tout refaire?
    Quand tu dis un thread a part je dois créer une partie avec 2 threads ou faire une nouvelle instance de partie avec un autre thread?

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    n'utilisez pas des objectinputstream / objectoutputstream pour synchronizer en continu des données entre serveur. Sinon voici ce qui se passera:


    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          Serveur                              client
     crée A
     A.setTruc(3)
     sérialisation avec contenu  ->  réception (monA)
                                     monA.getTruc()==3
     A.setTruc(4)
     sérialization par référence ->  réception d'une référence au A déjà recu avant 
                                     monNouveauA == monA et monNouveauA.getTruc()==3 !

    en sérialisation, l'ensemble des objet sérialisé sont supposé ne pas changer de valeur/contenu entre le moment ou l'objetOutputStream est créé et le moment où il est cloturé.


    Pour synchroniser des objets entre un client et un serveur de manière continue, optez plutot pour du RMI

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    ce serai avec plaisir pour les rmi mais j'ai des consignes bien précises sur l'utilisation des objectOutput et objectInput....

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ben dans ce cas, après chaque envoi, tu ferme l'objetoutputstream et l"objectinputstream et t'en recrée un nouveau. J'en ai déjà expliqué la raison. Tes objectxxxxxxstream ne devraient pas avoir une durée de vie de plus de quelques millisecondes.

  13. #13
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Tes objectxxxxxxstream ne devraient pas avoir une durée de vie de plus de quelques millisecondes.
    Et pourquoi ça?
    J'aimerais bien avoir plus de précisions sur ce point.

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    je l'ai expliqué plus haut, c'est pas prévu pour y stocker plusieurs fois des objets qui changent d'état entre deux (et pour cause, l'objectouptustream te garanti qu'un objet ne sera pas sérialisé deux fois!). Hors dans son cas (jeu client serveur), il y a fort à parier que l'état "serveur" sera tenté d'être renvoyé plusieurs fois au client, d'ou une désynchronisation dans le temps entre ce que vois le serveur et qu'il crois envoyer et ce que vois le client! Ou alors faut systématiquement tout cloner avant de l'envoyer pour garantir que ce sont des nouveau objets, mais là t'aura un autre problème. ObjetOutputstream gardant, le temps de son travail, en mémoire la référence à tous les objets qu'il a envoyé (justement pour pas les envoyer deux fois), tu risque de progressivement bouffer la mémoire du serveur et du client....

  15. #15
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    C'est pour contrer cela que je conseillais d'utiliser la méthode reset() qui efface la mémoire du ObjectOutputStream.

    Mais je ne vois toujours pas pourquoi il ne faut pas conserver un ObjectOutputStream.

    P.S: je cherche juste à savoir, car j'ai déjà fait des appli qui communiquais via ObjectStream sans soucis. Donc si j'ai mal fait, je veux comprendre.

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    donc ok je ferme a chaque fois, mais je dois changer quoi d'autre? ^^'

Discussions similaires

  1. probleme avec les threads et class
    Par cosmoff dans le forum Général Python
    Réponses: 1
    Dernier message: 25/05/2015, 14h32
  2. Probleme avec les Threads
    Par ouxss dans le forum C++
    Réponses: 2
    Dernier message: 05/01/2010, 10h27
  3. Probleme avec les threads
    Par Loenix dans le forum Général Python
    Réponses: 4
    Dernier message: 04/06/2009, 14h50
  4. Probleme avec les thread
    Par jonny dans le forum MFC
    Réponses: 11
    Dernier message: 01/06/2006, 17h37
  5. Probleme avec les threads
    Par Orahn dans le forum MFC
    Réponses: 5
    Dernier message: 04/11/2005, 10h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo