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 :

UDP client / serveur "retardé"


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 109
    Points : 68
    Points
    68
    Par défaut UDP client / serveur "retardé"
    Bonjour,

    J'ai suivit le tutoriel Java de jmd dans les cours et tutoriels pour bien apprendre Java : http://java.developpez.com/cours/ pour utiliser la connexion entre un serveur et son client.
    L'exemple marche niquel, j'ai donc compliqué un peu plus les choses...
    Le client demande une initialisation et pour cela le serveur lui envoie deux messages differents. Le client ne reçoit que le 1er.
    Lorsque le client fait une autre demande au serveur, celui ci envoit un 3eme message, à ce moment seulement, le client reçoit le deuxieme! et ainsi de suite pour les suivants...
    je suppose que le problème vient plus ou moins que le buffer n'est pas remplit ou qu'il faut vider une sorte de cache...

    il y a deux choses que je ne comprends pas:
    -dans le client pourquoi a t on final static int taille = 1024; ET int taille = 0;?
    -le paquet qu'on envoie à donc une taille fixe ainsi que celui qu'on reçoit? Si je change la taille de mon buffer je ne recoit plus du tout de truc correct...

    Auriez vous une idée pour recevoir les messages correctement?
    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 109
    Points : 68
    Points
    68
    Par défaut
    Je vous met un peu de mon code pour voir si vous y voyez plus clair:


    COTE SERVEUR.JAVA
    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
     final static int port = 9632;
        final static int taille = 1024;
        static byte buffer[] = new byte[ taille ];
        static DatagramPacket paquet = new DatagramPacket( buffer, buffer.length );
        static DatagramSocket socket;
     
        public static void main( String argv[] ) throws Exception {
     
            initialisationMetier();
     
            socket = new DatagramSocket( port );
            String donnees = "";
     
            int taille = 0;
     
            System.out.println( "Lancement du serveur" );
            while( true ) {
     
                socket.receive( paquet );
     
                System.out.println( "\n" + paquet.getAddress() );
                taille = paquet.getLength();
                donnees = new String( paquet.getData(), 0, taille );
                System.out.println( "Donnees reçues = " + donnees );
                traitementReception( donnees );
     
            }
        }
     
        public static void traitementReception( String donnees ) {
            String messageRecu[] = donnees.split( "µµ" );
     
            if ( messageRecu[ 0 ].equals( "demanderinitialisationIhm" ) ) {
                String message = Controleur.afficherIhmApplications();
                envoyerMessage( message );
                String messageProfil = Controleur.afficherIhmProfils();
                envoyerMessage( messageProfil );
            }
             if ( messageRecu[ 0 ].equals("afficherIhmVersionsApplication" ) ) {
     
                String message = Controleur.afficherIhmVersionsApplication(messageRecu[ 1 ]);
                envoyerMessage( message );
            }...
    }
     
        public static void envoyerMessage( String message ) {
            DatagramPacket envoi = null;
     
            System.out.println( "Donnees envoyees = " + message );
            envoi = new DatagramPacket( message.getBytes(), message.length(), paquet.getAddress(), paquet.getPort() );
            try {
                socket.send( envoi );
     
            }
            catch( IOException e ) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
        }
    ------------------------------------------------------------------------

    COTE CLIENT.JAVA

    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
     final static int port = 9632;
        final static int taille = 1024;
        final static String adresse = "172.31.1.93"; //TODO mettre adresse base registre
       // static byte buffer[] = new byte[taille];
        static InetAddress serveur ;
        static DatagramSocket socket;
     
        public static void init(){//main(String argv[]) throws Exception {
     
              try {
                serveur = InetAddress.getByName(adresse);
                socket = new DatagramSocket();
            }
            catch( UnknownHostException e ) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ConsoleIhm.gererExceptions( "UnknownHostException" );
            }
            catch( SocketException e ) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ConsoleIhm.gererExceptions( "UnknownHostException" );
            }
        }
     
        public static void demandeServer(String st){
                try{
                int length = st.length();
                byte buffer[] = st.getBytes();
     
                DatagramPacket donneesEmises = new DatagramPacket(buffer, length, serveur, port);
                System.out.println(donneesEmises);
     
                socket.setSoTimeout(30000);
                socket.send(donneesEmises);
     
     
                receptionServer();
                } catch (SocketTimeoutException ste) {
                    System.out.println("Le delai pour la reponse a expire");
                } catch (Exception e) {
                    e.printStackTrace();
                }
        }
     
        public static void receptionServer(){
            DatagramPacket donneesRecues = new DatagramPacket(new byte[taille], taille);
        try {
            socket.receive(donneesRecues);
     
            String stringrecue=new String(donneesRecues.getData(), 
                0, donneesRecues.getLength());
            System.out.println("Message : " + new String(donneesRecues.getData(), 
                0, donneesRecues.getLength()));
              System.out.println("de : " + donneesRecues.getAddress() + ":" + 
                donneesRecues.getPort());
            traitementReception(stringrecue);
        }
        catch( IOException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            ConsoleIhm.gererExceptions( "UnknownHostException" );
        }
     
     
        }
     
     
        public static void traitementReception(String donnees){
     
           String messageRecu[]= donnees.split( "µµ" );
     
            if(messageRecu[0].equals("ajouterIhmApplication")){            
                for(int i=1;i<messageRecu.length;i++){
                    String donnesAppli[]= messageRecu[i].split( "/µ" );
                    ConsoleIhm.ajouterIhmApplication( donnesAppli[0], donnesAppli[1] );
     
                }
            }
            if(messageRecu[0].equals("ajouterIhmProfil")){            
                for(int i=1;i<messageRecu.length;i++){
                    ConsoleIhm.ajouterIhmProfil(messageRecu[i] );
                }
            }
    }
    -------------------------------------------------------------------
    Lorsque le client demande l'initialisation, le serveur imprime bien les deux messages afficherIhmApplications afficherIhmProfil mais cela ne remplit que les applications. Par contre lorsque le client envoie afficherIhmVersionsApplication, il recoit et remplit le profil puis à la demande suivant il recoit et remplit les versions...etc ...
    toujours avec un temps de retard...
    quelqu'un voit le problème?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 109
    Points : 68
    Points
    68
    Par défaut
    je ne m'explique pas pourquoi mais voilà comment j'ai résolu mon problème...

    Au lieu d'envoyer deux messages depuis le serveur lorsque je veux initialiser mon client:
    AVANT
    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
     
    SERVER.JAVA
    if ( messageRecu[ 0 ].equals( "demanderinitialisationIhm" ) ) {
                String message = Controleur.afficherIhmApplications();
                envoyerMessage( message );
                String messageProfil = Controleur.afficherIhmProfils();
                envoyerMessage( messageProfil );
            }
    CLIENT.JAVA
    if(messageRecu[0].equals("ajouterIhmApplication")){            
                for(int i=1;i<messageRecu.length;i++){
                    String donnesAppli[]= messageRecu[i].split( "/µ" );
                    ConsoleIhm.ajouterIhmApplication( donnesAppli[0], donnesAppli[1] );
     
                }
            }
            if(messageRecu[0].equals("ajouterIhmProfil")){            
                for(int i=1;i<messageRecu.length;i++){
                    ConsoleIhm.ajouterIhmProfil(messageRecu[i] );
                }
            }
    APRES
    J'envoie deux demandes depuis le client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public static void demanderinitialisationIhm() {
            demandeServer( "demanderinitialisationIhmApplicationµµ" );
     
            demandeServer( "demanderinitialisationIhmProfilµµ" );
        }

    J'en conclut qu'on ne peut envoyer deux messages de suite depuis le serveur mais ça ne pause pas de problème depuis le client!
    Si quelqu'un y comprends quelque chose... ça marche mais c'est mieux de comprendre pourquoi

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

Discussions similaires

  1. Problème UDP Client/Serveur : Reception impossible.
    Par qhardy dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 01/03/2009, 17h50
  2. socket UDP client/serveur
    Par xokami35x dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 10/06/2008, 19h57
  3. [ServerSocket]Problème communication client-serveur udp sur linux
    Par gdecrouez dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/09/2006, 14h59

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