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 :

préparer le buffer pour un paquet à envoyer


Sujet :

avec Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut préparer le buffer pour un paquet à envoyer
    Bonjour

    voila j'ai un petit probleme pour construire mon paquet que je doit l'envoyer par une soket, j'ai créré mon paquet avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    byte buffer[] =null;
    Datagrampacket  paquet = new Datagrampacket (buffer, var.lenght,addr,2002)
    jusqu'au là tous marche bien,

    mais pour construire mon paquet je doit définir les donnée que je doit envoyer dans le buffer,et moi je veux envoyer exactement :

    Buffer= int int String String Real Real
    ex : buffer : 15 -15 TEST VAR 13.2 45.34

    voila c'est ça le probleme exactement c'est que j'arrive pas a construire mon buffer comme je veux exactement sachant que le buffer il est de type byte[]


    donc si vous avez des idées n'hésiter pas merci

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    idée: convertir la string vers un byte[]?

    cf. String#getBytes(String)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Bonjour

    merci pour ta réponse mais justement c'est pas just un String, pour le string c'est le plus facile. voila ce que je doit faire exactement
    convertir INT --> Byte[]
    Convertir String --> Byte[]
    Convertir Real --> Byte[]

    et enfin concaténer ou enregistré les trois résultat obtenu dans le buffer pour envoyer le tous dans un paquet.

    j'éspere que c'est plus claire maintenant

    merci

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Juste par hasard. Tu es sûr de vouloir utiliser une connexion UDP (DatagramSocket et DatagramPacket) et non une connexion TCP ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    oui d'apres le cahier de charge il demande une connection UDP donc je suis obliger

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Oui j'ai bien compris, mais de mélanger int encodés binaires + strings encodées dans un charset spécifique + float ou double etc.. n'est pas forcément une bonne idée

    au moins quand tu transfère en mode texte, c'est humainement compréhensible et plus simple à décoder

    maintenant, si vraiment tu n'as pas le choix (si tu dois communiquer avec un système existant) alors il faut utiliser les décalages

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i = 542;
     
    byte[] theint = new byte[4];
    theint[0] = (byte) i;
    theint[1] = (byte) (i >> 8);
    theint[2] = (byte) (i >> 16);
    theint[3] = (byte) (i >> 24);
    mais rien ne garantit que ce format sera accepté par le receveur... à moins que tu nous expliques exactement la situation...


    PS: merci de ne pas envoyer de MP pour des sujets ouverts sur le forum

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    merci bcp pour ta réponse justement c'est ça le probleme je doit communiqué avec un API qui éxiste déja et je doit le répondre éxactement comme ça
    donc voila pour le INT je pense que ça me va comme réponse je vais essayé ça mais pour le Real je doit faire comment par exemple pour 452,53 ???!!!

    merci

  8. #8
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    idem, sauf qu'un double est encodé sur 64 bits donc 8 byte, donc il te faut un tableau de 8 cellules + 8 décalages

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    double d = 452.3254;
     
    byte[] thedouble = new byte[8];
    thedouble[0] = (byte) d;
    thedouble[1] = (byte) (d >> 8);
    thedouble[2] = (byte) (d >> 16);
    thedouble[3] = (byte) (d >> 24);
    thedouble[4] = (byte) (d >> 32);
    ...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    mais je ne sais pas pourquoi il accetpte pas l'operateur >>

    il me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    the operator >> is undefined for the argument type(s) double,int
    je travail sur eclipse .

  10. #10
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    hum ha oui en effet....

    désolé, je t'ai dit une bêtise, les opérateurs de décalage ne fonctionnent pas avec les nombres réels.

    sinon, ptetre qu'en bidouillant avec la fonction toHexString...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String s = Double.toHexString(d);

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    ok c'est pas grave y a pas de probleme

    j'ai fait des testes pour plus de d'étail peut etre ça peut aidé :

    voila le API ce qu'il m'envoie pour un Real

    pour 10 par exemple je reçoie A 32 0 0 je reçoie bien les 4 octet

    et donc moi il faut que je fait pareil pour lui envoyé 1O il faut que j'envoie A 32 0 0

    mais le probleme c'est que j'arrive pas a construire mon buffer, comment obtenir A 32 0 0 apartir de 10

    un autre exemple : pour -10,5 je reçoie -63 40 0 0

    si vous avez des idées je suis proneur merci

  12. #12
    Membre très actif
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte buffer[] =null;
    Datagrampacket  paquet = new Datagrampacket (buffer, var.lenght,addr,2002);
    A remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import java.nio.ByteBuffer;
     
    // ...
     
    byte[] buf = new byte[var.length]; // Je suppose que tu as une variable var qui te donne la taille de ton paquet comme plus haut.
    ByteBuffer buffer = ByteBuffer.wrap(buf);
    Datagrampacket  paquet = new Datagrampacket (buf, buf.lenght,addr,2002);
    Tu trouvera toutes les méthodes dont tu as besoin pour envoyer tes données sans te casser la tête dans le bytebuffer, aussi bien en écriture qu'en lecture.


    Pour le protocole TCP, on préférera un DataInputStream / DataOutputStream.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    merci pour ta réponse

    mais y a un truc que je comprend pas ta variable buf tu la déclarer ou ??? et c'est elle qui doit contenir mes données ??

    merci

  14. #14
    Membre très actif
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Par défaut
    Oups, autant pour moi !

    j'ai fait un peu trop vite lors de la déclaration du tableau d'octets ... j'ai changé ça.

Discussions similaires

  1. paquets envoyés plus importants que ceux recus
    Par joe123 dans le forum Hardware
    Réponses: 12
    Dernier message: 14/12/2006, 13h05
  2. Z-Buffer pour transparence inexistant ?
    Par Bart_lx dans le forum OpenGL
    Réponses: 12
    Dernier message: 31/01/2006, 15h25
  3. Alignement de buffers pour le xmmx
    Par Flo. dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 24/01/2006, 10h11
  4. buffer pour fichier
    Par Bug's Bunny dans le forum C
    Réponses: 6
    Dernier message: 11/06/2004, 13h21

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