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

avec Java Discussion :

Problème dans une application en réseau


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 16
    Points
    16
    Par défaut Problème dans une application en réseau
    Bonjour ou bonsoir à tous

    Je suis actuellement en train de coder un petit pong basique en ligne (donc 1v1).

    Pour se faire j’ai donc une application client et une application serveur.

    Dans le serveur, chaque fois qu’un client se connecte, un thread d’écoute (MsgIn dans le programme serveur) se crée et en fonction des actions du client/des clients, des messages (MsgOut) sont envoyés à ces derniers.

    Au niveau du client, il y a un thread d’écoute (GameSockIn) qui récupère les données qui sont envoyées par le serveur et un thread d’envoie de données (GameSockOut) au serveur.

    Je lance mon serveur et mes 2 clients sur le même ordinateur.

    Jusqu’ici tout va bien, le serveur se lance sans souci, les 2 clients aussi.

    Mais lorsque je fais des actions en continu sur un client (donc bouger la raquette), l’action n’est pas retranscrite parfaitement sur le 2ème client. Il y a comme une impression de « lag ».

    Par moment même, par exemple, la balle se déplace de façon X sur le client 1 et sur le client 2 la balle est déjà en dehors de l’écran, etc.

    Les données qui sont transmissent entre les applications sont des simples « string ».

    J’aimerai savoir où pourrait être le problème dans mon/mes application(s), et éventuellement quel(s) point(s) je pourrais améliorer pour une première application en réseau.

    Tous conseils au niveau de la façon de coder, ou autres sont les bienvenus

    Merci pour votre aide éventuelle.

    Le serveur : http://getfreakzz.esy.es/ServeurPong.zip

    Le client : http://getfreakzz.esy.es/PongNet.zip

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 998
    Points
    7 998
    Par défaut
    Citation Envoyé par GetFreakz Voir le message
    Les données qui sont transmissent entre les applications sont des simples « string ».
    Qu'echange tu concretement ? (je ne parle pas du message d'accueil ^^)

    Est-ce le serveur qui gère "la physique" des raquette et de la balle en fonctions des input clavier du client, client qui recoit les positions que le serveur connait et calcul ? (autrement dit, le client ne fait qu'envoyer des actions des touches et reçoit les positions que le serveur aura calculé. Le serveur recoit les input, reagit en conséquence, calcule les positions, les renvoyes au client).

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Salut, et merci pour ta réponse.

    En gros, les clients envoient uniquement les positions de la raquette au serveur. Le serveur récupère les positions en temps réel, le stocke dans un tableau. Le serveur renvoie la position à l'autre client correspondant, et ainsi de suite.

    Le serveur transmet des ordres comme : créer la balle (lorsque 2 clients sont connectés), lancer la balle dans une direction (si il y a une collision avec une raquette, la balle part dans un sens ou dans l'autre aléatoirement). C'est le serveur qui calcule les collisions de la balle avec les raquettes ou les "murs".

    Au niveau de la position de la balle, le serveur envoie simplement (par exemple : ballRight, ballLeft, ballUp, ballDown) au client. Le client calcul la trajectoire de la balle (par exemple si le client a reçu un message du serveur de type ballRight, la balle ira à droite).
    Le même calcul se fait au niveau du serveur (donc si le serveur a ballRight à true, la position en X de la balle va s'incrémenter)

    Le serveur n'envoie pas la position en X et Y de la balle en temps réel aux deux clients, uniquement des messages droite, gauche, bas, haut.
    Je ne comprends pas le souci, puisque chaque client reçoit le même message, mais par moment, la balle ne réagit pas de la même façon sur les clients.

    Sinon, le problème n'est pas uniquement au niveau de la balle, mais aussi au niveau des mouvements de la raquette.
    Par exemple : si le client 1 bouge la raquette de haut en bas en continue, pas de problème, mais quand on regarde au niveau du client 2, la raquette correspondante ne bouge pas de la même manière, il y a parfois un décalage ou une impression de lag.

    Et petite précision, j'utilise TCP, je sais que c'est moins rapide que de l'UDP, mais je ne crois pas que le problème devrait venir de là. Au niveau de l'envoie de messages, ce sont des strings du stype : serveur-créerball ou encore move-248 (248 pour la position en Y de la raquette).

    J'espère que ces informations pourront t'aider, je débute dans le réseau donc une grande partie du problème doit se trouver ici haha.

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 998
    Points
    7 998
    Par défaut
    Ben essaye en faisant "le client ne fait qu'envoyer des actions des touches et reçoit les positions que le serveur aura calculé. Le serveur recoit les input, reagit en conséquence, calcule les positions, les renvoyes au client".

    Car ta méthode me semble bizarre mais bon je n'ai jamais fait ce genre de choses non plus ^^

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Merci, je vais tester ça. Je compte reprogrammer les applications de 0 étape par étape pour voir un peu d'où pourrait venir le souci.

    Tu as testé le programme de ton côté pour voir si ça fait la même chose au niveau des raquettes?

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 998
    Points
    7 998
    Par défaut
    Oui mais quand je deplace la raquette du client 1 je ne vois pas qu'elle bouge dans client 2, par contre on dirait que la collision se fait quand même ou il faut. (la balle bouge des 2 cotés ça oui aussi).

  7. #7
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Bonsoir,
    Après analyse de votre code, je dirai que votre problème vient d'un défaut de synchronisation. En effet, vous utilisez le même socket pour lire et écrire vos messages. Moralité, si le client 1 appuie sur une touche pour déplacer sa raquette, ce dernier enverra un message au serveur, qui à son tour, après avoir calculé la nouvelle position de la raquette concernée, va envoyer les nouvelles coordonnées de cette dernière au second client. Malheureusement, le client 2 a appuyé en même temps, ou un tout petit peu avant sur une touche pour déplacer sa raquette, du coup, serveur et client 2 écrivent en même temps dans le même socket. Aucun des deux ne reçoit le message de l'autre, au regard de votre code, ça n'est pas gênant, il poursuit, et comme les coordonnées ont été correctement calculées, virtuellement, tout est juste, sauf que chez client2, il ne s'est rien passé, il ne voit pas la raquette de client1 se déplacer.
    Je penses que vous devriez envisager utiliser deux sockets. Un pour lire, l'autre pour écrire, chacun étant gérer par un Thread autonome. Ainsi, s'il arrive un moment où serveur envoie un message à un client pendant que ce dernier s'apprête à lui en envoyer un, les deux réceptionneront leur message puisqu'il ne s'agira plus du même socket. De part et d'autre, un socket pour écouter, et un socket pour écrire.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Merci à toi yotta pour ton message.

    Le problème est que les 3 applications tournent en même temps sur mon ordinateur. Donc serveur, et les 2 clients.
    Lorsque je bouge la raquette du client A, je ne touche pas à l'application du client B.
    Du coup, impossible d'envoyer simultanément des données du client A et du client B en même temps. (je ne sais pas si tu comprends?)
    Mais en effet, c'est vrai qu'au niveau de l'archi réseau ça posera un problème lorsque les applications seront lancés sur des postes différents.

    Au niveau du problème, on m'a dit que ça pouvait provenir d'un problème de latence, et qu'une des solutions proposées était de faire de la prédiction niveau client.
    Je suis actuellement en train de repartir de 0 et en codant via UDP pour plus de rapidité encore (enfin je le pense).

    Du coup, si je comprends bien, ce que tu me proposes et au niveau du client un thread d'émission et un thread de réception.
    Et sur le serveur un thread par client avec à l'intérieur un thread d'émission et un pour la réception?
    Au niveau du client c'est déjà le cas, mais sur le serveur j'ai un thread par client pour la réception et cette même classe fait appelle au méthode d'une classe pour l'émission.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Bonjour, après vérification et analyse de mon code.

    Le problème est assez simple. Le souci venait de mon thread d'émission au niveau client et non pas un problème de transmission et réception.

    Dans mon code de base j'avais une classe pour l'émission avec une boucle (while(true)) et à l'intérieur un boolean (qui était modifié dans le GameListener (la classe qui gère l'appui des touches) pour dire si oui ou non j'écris dans le socket.

    Lors d'un appui normal, pas de souci mais lorsque j'alternais rapidement un changement de direction, il y avait une légère latence dans le changement de valeur du boolean.

    Voici le bon code pour la classe d'émission :

    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
    import java.net.*;
    import java.io.*;
     
    public class GameSockOut implements Runnable {
        private DatagramSocket client;
        private String msg;
        private String cmp;
     
        public GameSockOut(DatagramSocket client) {
            this.client = client;
        }
     
        @Override
        public void run() {
            while(true) {
                try {
                    byte [] buffer = new byte[30];
                    int port = 56000;
     
                    InetAddress adresse = InetAddress.getByName("127.0.0.1");
                    DatagramPacket packet = new DatagramPacket(buffer, buffer.length, adresse, port);
                    this.msg = "move-"+GamePanel.y;
                    if(!msg.equals(cmp)) {
                        cmp = msg;
                        packet.setData(this.msg.getBytes());
                        this.client.send(packet);
                    }
                } catch(IOException e) {}
            }
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probléme d'adresse IP dans une application réseau
    Par slim_java dans le forum VirtualBox
    Réponses: 4
    Dernier message: 16/08/2010, 21h24
  2. Réponses: 40
    Dernier message: 21/06/2007, 17h58
  3. problème de socket dans une application win32
    Par deck_bsd dans le forum Windows
    Réponses: 5
    Dernier message: 20/01/2007, 18h32
  4. [Forum] Login dans une Application PHP
    Par ChrisColumbus dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 19/11/2006, 02h49

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