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

JavaFX Discussion :

ProblemeJavaFX et TCP.


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Par défaut ProblemeJavaFX et TCP.
    Bonjour à tous, je suis actuellement en train d'implémenter un jeu de puissance 4 en java, jouable par TCP. Mon IHM est en javaFX.
    Le jeu fonctionne très bien sur un seul poste, mais l'implémentation du réseau me pose de gros problemes.

    En effet, le mode TCP implique l'utilisation de boucle while(flux non pres) pour attendre la réponse du client ou du serveur.

    J'ai ainsi un code qui ressemble au suivant :
    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
     
    	        content: [
    	            Group {
    	               	onMousePressed: function (e) {
     
    		                   println("Evenement souris");	               	    	                	    
    	   	    	            var maDonnee: String = null;
     
    		               	    var x = p4Board.convertPointToCoord(e.x);
    		               	    var y = p4Board.convertPointToCoord(e.y);
    	   	    	            println("Pose le pion");
    	   	    	            p4Board.poserPion(x, y, Couleur.JAUNE);
     
    	   	    	            println("Envoie position");
    	   	    	            p4Client.envoiePosition("{x}", "{y}");
     
    	   	    	            println("Attente reponse server");									                	    	
    	   	    	            maDonnee = p4Client.attenteDonneesServer();
     
    	   	    	            if(TCPCommand.ENVOIE_POSITION.equals(maDonnee)) {
    	   	    	            	var position:String =  p4Client.recoitDonnees();
    	   	    	                var positionSplit:String[] = position.split(":");
     
    	   	    	                var coordX: String = positionSplit[0];
    	   	    	                var coordY: String = positionSplit[1];
     
    	   	    	                p4Board.poserPion(Integer.parseInt(coordX), Integer.parseInt(coordY), 
    	   	    	                	    							Couleur.JAUNE);
     
    	   	    	            }
    		                }	
    	                content: [
    	                   p4Board,
    	                   btnStartClient
    	                ]
    L'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maDonnee = p4Client.attenteDonneesServer();
    attend une réponse du server, elle est donc bloquante tant que le server n'a pas répondu. Or, bien que j'ai exécuté l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     p4Board.poserPion(x, y, Couleur.JAUNE);
    avant (qui passe la couleur d'un cercle présent dans la Scene a jaune lors d'un click de souris), le cercle ne passe à jaune que lorsque j'ai obtenu une réponse du server, c'est a dire lorsque ma boucle while s'est débloquée et que l'on est sorti du Bloc onMousepressed. Ceci induit un décalage d'un coup, entre le click souris et l'affichage à l'écran, le coup ne s'affichant que lo'rsque l'opposant à joué. Je ne comprends pas pourquoi il faut attendre la sorti du Block pour modifier la Scene, et je ne vois pas du tout comment résoudre ce problème. Avez vous des solutions ?

    Merci d'avance

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Février 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 284
    Par défaut
    Alors la tu tapes en plein dans l'asynchrone, ton code s'execute dans le processus qui "gère" l'interface", donc tant qu'il n'est pas fini, l'interface "bloque". Regarde donc du coté de JFXWorker de la librairie JFXtras qui pourrait t'être d'un grand secours.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Par défaut
    Merci du tuyau !
    En cherchant du coté de l'asynchrone, j'ai en effet résolu mon probleme !
    L'utilisation du package javafx.async et plus particulièrement des classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    javafx.async.JavaTaskBase;
    javafx.async.RunnableFuture;
    est comme tu me l'avais dit nécessaire !

    J'ai utilisé l'exemple suivant pour créer une tache de fond qui communique avec ma Scene sans bloquer le processus principal :

    http://blogs.sun.com/clarkeman/entry/javafx_async_task

    Et en plus, je rend mon main plus propre en déportant toutes les instructions de communications.

    Une ruse de sioux, merci encore

Discussions similaires

  1. Ping sous protocole TCP (et non UDP)
    Par ovdz dans le forum Développement
    Réponses: 2
    Dernier message: 19/06/2003, 14h10
  2. [socket][tcp] jeu en reseau
    Par souris_sonic dans le forum Développement
    Réponses: 2
    Dernier message: 30/05/2003, 07h31
  3. [Concept]Concept d'un serveur TCP/IP
    Par Zc dans le forum Développement
    Réponses: 8
    Dernier message: 17/01/2003, 17h06
  4. Différence entre TCP, UDP, ICMP
    Par GliGli dans le forum Développement
    Réponses: 1
    Dernier message: 13/09/2002, 08h25
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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