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

Format d'échange (XML, JSON...) Java Discussion :

XML et socket UDP


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Par défaut XML et socket UDP
    Bonjour,

    Dans le cadre d'une appli client/serveur je dois envoyer des messages au format XML via protocole UDP mais je bloque ... Voici mon code actuel afin que vous m'aidiez à trouver l'erreur, apparemment le message est bien envoyé par le client mais la reconstitution avec SAXBuilder coté Serveur me rapporte des tonnes d'erreurs... :

    Cote Client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    DatagramSocket socket = new DatagramSocket() ;
     
    Document doc = new Document(racine) ;
    ByteArrayOutputStream b = new ByteArrayOutputStream();
    XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat()) ;
     
     sortie.output(doc,b);
     byte[] message = b.toByteArray();
     DatagramPacket packet = new DatagramPacket(message,message.length,
                                            new InetSocketAddress("localhost", 55678));
     
    socket.send(packet);
    Coté Serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DatagramSocket socket = new DatagramSocket(55678) ;
    SAXBuilder sxb = new SAXBuilder();
     
    byte[] tampon = new byte[1024] ;
    DatagramPacket packet = new DatagramPacket(tampon,tampon.length);
    socket.receive(packet);
     
    Document doc = sxb.build(new ByteArrayInputStream(packet.getData())) ;

    Merci d'avance pour votre aide

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    D'un coté tu crée un document complet, de l'autre tu ne lit que les premier 1024 octets....

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Par défaut
    Je ne pense pas que l'erreur vienne de là, mon document xml ne comporte qu'une ligne et même en augmentant la taille du byte[] j'ai toujours le même problème...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Dans ce cas donne nous ton erreur.

    Aussi, tu devrais savoir que la commande receive ne rempli pas nécessairement ton buffer.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Par défaut
    J'ai en fait une erreur JDOMException au niveau du sxb.build(new...)

    org.jdom2.input.JDOMParseException: Error on line 3: Contenu non autorisé dans la section de fin.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ton DatagramPacket contient deux autres méthodes importantes:

    * getOffset(), qui t'indique, dans le tableau retourné par getData(), à partir de quel index se trouve la première donnée qui a été lue (dans ton cas, tu suppose que c'est 0 ce qui n'est pas nécessairement vrai)
    * getLength(), qui t'indique quelle quantité de données ont été lues. Dans ton cas, tu suppose que c'est 1024, ce qui n'est pas nécessairement vrai.

    Té données se trouve dans getData[] entre l'index getOffset() et (getOffset()+getLength())%1024


    Tu va devoir utiliser le constructeur ByteArrayInputStream(byte[] buf, int offset, int length) pour que ça colle.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Par défaut
    Et bien merci cela corrige effectivement mon problème. Cependant pourrais-tu m'expliquer ce qui se passe en mémoire pour que l'offset ne soit pas nécessairement à 0 ? Je n'avais jamais eu ce problème en travaillant avec des Object****Stream.

    (Edit : Dans ce cas l'offset était en fait bien à 0, il était donc nécessaire de la fin des données je suppose.)
    Merci

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par R00t_infinity Voir le message

    (Edit : Dans ce cas l'offset était en fait bien à 0, il était donc nécessaire de la fin des données je suppose.)
    Merci
    On ne parle pas d'objectInputStream ici, on parle de DatagramPacket. Et l'objet DatagramPacket , en gros, c'est un buffer cyclique dans lequel la méthode receive va écrire. Tu dois donc tenir compte de l'offset et de length, ces deux paramètres sont nécessaire dans une buffer utilisé de manière cyclique.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Par défaut
    Merci pour toutes ces précisions Problem solved !

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

Discussions similaires

  1. Pb de socket udp
    Par phoenixia dans le forum MFC
    Réponses: 7
    Dernier message: 01/06/2006, 17h08
  2. [socket UDP] Codage BER : Format des Tag (TLG)
    Par Lolita59 dans le forum Réseau
    Réponses: 28
    Dernier message: 19/05/2006, 17h37
  3. Socket : UDP ou TCP
    Par lafracas dans le forum Développement
    Réponses: 2
    Dernier message: 10/04/2006, 22h43
  4. code c pour sockets (udp vers tcp et inversement)
    Par HiT dans le forum Développement
    Réponses: 11
    Dernier message: 19/11/2005, 18h03
  5. Notion sur Socket UDP
    Par oxor3 dans le forum Développement
    Réponses: 3
    Dernier message: 05/04/2004, 00h19

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