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

Entrée/Sortie Java Discussion :

BufferedReader et la lecture des bytes


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 131
    Points : 93
    Points
    93
    Par défaut BufferedReader et la lecture des bytes
    Salut;
    est ce que je pourrai recevoir un message codé en bytes avec l'objet BufferedReader ?
    la méthode readline() permet de récupérer un String et read() un entier , donc je voulais utiliser la dernière qui me retourne un entier mais je ne sais pas quelle méthode me retourne la taille du message pour faire une boucle . en plus je ne dispose pas pour l'instant l'autre partie du code qui est une application serveur qui émit les messages codés en bytes en vue que c'est intégrée sur le PC du robot pour faire des testes.
    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
     
                  BufferedReader recieve;
     
                  recieve= new BufferedReader(
                                   new InputStreamReader(ReceveSocket.getInputStream())
                                  );
    .......................................
    ......................................
    ..............................????????????????? (une supposition SVP)

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    De maniere generale, un InputStream représente simplement un flux de données entrant. Si tu as besoin de lire simplement des bytes, tu peux utiliser directement le input stream donné par ReceveSocket.getInputStream() plutot que de passer par un BufferedReader qui, comme son nom l'indique, permet de bufferiser les données en entrée et permet moins d'acces à la source (typiquement, si l'entrée est un fichier lu avec read(), cela évite d'acceder au disque à chaque lecture).

    Bref, un Input Stream n'a pas de notion de "taille de fichier" ou de "taille de message". Tu parles d'une communication avec un robot. Le plus simple est de connaitre le protocol de communication qui permet surement de recuperer la quantité de données envoyées. Dans ce genre de cas, l'usage de de reserver les 1, 2 ou 4 premiers bytes pour transmettre la taille du message et d'envoyer ensuite le contenu (ce que tu peux faire si tu as la maitrise du robot en question). Sinon, il faut regarder la doc et voir comment faire. C'est quoi comme robot ?

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 131
    Points : 93
    Points
    93
    Par défaut
    certainement vous avez raison Mr sur ce point et merci pour les informations
    ce que tu peux faire si tu as la maitrise du robot en question
    mais SVP est ce que lorsque je mets cette instruction à mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String s=recieve.readLine();
    j'ai la possibilité de récupérer le message sous forme d'un String , puisque mon but est d'avoir le message et peu importe pour le format sur lequel est envoyé (bytes ,.....etc) càd implicitement le bufferedReder va s'occuper des conversions ????.
    Merci d'avance et bien cordialement

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    La méthode readLine va construire une chaîne de caractère et s'arrête dès qu'elle lit le caractère de code zéro (\0).
    Si le protocole de communication avec le robot n'est pas en caractère ASCII imprimable, le readLine ne sert à rien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 131
    Points : 93
    Points
    93
    Par défaut
    oui il est normalement en ASCII puisque j'ai ce petit code en C# concernant la communication
    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
     
       private byte[] buffer = new byte[1024];
       public String Recevoir()
            {
                String msg;
     
                try    //ou while(true)
                {
                    byteRecue = ReceveSocket.Receive(buffer);
                    msg = Encoding.ASCII.GetString(buffer, 0, byteRecue);
                }
                catch
                {
                    return "Erreur lors de la réception.";
                }
     
     
                return msg;            
            }
    et je voulais le traduire en java, mais dans cette communication il sait le nombre de bytes reçu ensuite il fait l'encodage , donc avec readline en java j'en ai pas besoin de tous ces instructions pour récupérer le message

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Le code C# que tu nous montres ne sait absolument pas quelle est la taille du message.

    Il fait juste le vœux pieux qu'un buffer de 1024 octets sera toujours assez grand pour recevoir le message, et qu'un message sera toujours envoyé de manière à ce que la pile réseau permette de le reconstituer avec un seul Receive().
    C'est un bug. Les sockets ne fonctionnent pas comme ça en informatique, ces suppositions sont erronées. Je suis sûr qu'elles marchent très souvent, mais c'est jusqu'au moment où elles ne marchent plus.

    Il est possible de faire l'équivalent en Java, mais ce serait tout aussi faux en Java qu'en C#, je recommande donc de ne pas faire ça.
    Pour connaître la taille d'un message, le plus simple est de forcer ce message à terminer avec un caractère précis. Le plus simple étant simplement '\n' parce que comme cela BufferedReader.readLine() va automatiquement le lire entièrement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 131
    Points : 93
    Points
    93
    Par défaut
    ok j'ai bien compris votre point de vue mais normalement la taille elle sera petite et le message se termine par un $ donc d'après votre réponse la lecture via un stream elle s'achève dés qu'elle trouve un caractère ?
    donc il me reste de faire un teste réel avec le robot
    Merci pour vos réponses

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Non c'est juste BufferedReader.readLine() qui est programmé pour s'arrêter dès qu'il voit une fin de ligne, et ni avant ni après.

    Le reste des fonctions de lecture, soit lisent un par un, soit s'arrêtent au petit bonheur la chance, en fonction de ce qui a été reçu sur le réseau et de ce que la pile réseau de l'OS a décidé d'en faire.
    Si tes messages se terminent toujours par $, le principe est de lire un par un jusqu'à ce que tu tombes sur $.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 131
    Points : 93
    Points
    93
    Par défaut
    donc un InputStream me permette de récupérer plusieurs messages comme une seule chaîne de caractères (ben un flux de données) càd message1 $ message2 $......... tout dépend les messages provenant et avec un BufferedReader.readline () un message dés quelle trouve un retour à la ligne, donc vous voulez dire sa dépend les messges envoyés pour que la façon sur laquelle je l'récupèrent

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Ah ben oui, suivant le protocole utilisé pour communiquer, on programme la réception et l'émission soit comme ci soit comme ça.

    C'est un peu la base de la programmation.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 20h27
  2. [FLASH MX2004] Lecture des parametres de l'url
    Par matN59 dans le forum Flash
    Réponses: 5
    Dernier message: 23/06/2006, 14h30
  3. Réponses: 2
    Dernier message: 14/12/2004, 19h42
  4. [JList] Lecture des données sauvegardées dans un fichier
    Par Myogtha dans le forum Composants
    Réponses: 7
    Dernier message: 10/06/2004, 22h05
  5. Réponses: 4
    Dernier message: 23/07/2003, 14h07

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