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

Langage Java Discussion :

[SOCKET][TCP] Problème de lecture d'un inputStream entre chaque envoi de donnée


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2020
    Messages : 2
    Points : 3
    Points
    3
    Par défaut [SOCKET][TCP] Problème de lecture d'un inputStream entre chaque envoi de donnée
    Bonjour à tous,

    j'ai besoin de lire un inputStream, sous forme de byte[], après chaque envoi de byte[]dans un outpuStream.
    Mais après la première lecture de l'inputstream, celui ci est toujours vide, sauf dans certains cas que je décris ci-dessous
    Pour l'information, je ne connais pas le nombre de byte qui me sera retourner.

    Je n'ai pas la main sur le serveur contacté, celui ci semble répondre plus ou moins rapidement suivant les données envoyées.


    Voici deux cheminement que j'obtiens actuellement, et le 3eme ce que je souhaite.

    • Cheminement 1 : je ne lis l'inputstream qu'à la toute fin

      -ouverture du socket
      -Envoie data1 à l'OutputStream (Le serveur retourne 3 byte)
      -Envoie data2 à l'OutputStream (Le serveur retourne 5 byte)
      -Envoie data3 à l'OutputStream (Le serveur retourne 10 byte)
      -Lecture de l'inputStream (je reçois 18 bytes 3+5+10)


    • Cheminement 2 : je lis l'inputstream entre chaque envoie à l'outstream

      -ouverture du socket
      -Envoie data1 à l'OutputStream (Le serveur retourne 3 byte)
      -Lecture de l'inputStream (je reçois 3 bytes)
      -Envoie data2 à l'OutputStream (Le serveur retourne 5 byte)
      -Lecture de l'inputStream (je reçois 0 bytes)
      -Envoie data3 à l'OutputStream (Le serveur retourne 10 byte)
      -Lecture de l'inputStream (je reçois 0 bytes)


    • Ce que je souhaite :

      -ouverture du socket
      -Envoie data1 à l'OutputStream (Le serveur retourne 3 byte)
      -Lecture de l'inputStream (je reçois 3 bytes)
      -Envoie data2 à l'OutputStream (Le serveur retourne 5 byte)
      -Lecture de l'inputStream (je reçois 5 bytes)
      -Envoie data3 à l'OutputStream (Le serveur retourne 10 byte)
      -Lecture de l'inputStream (je reçois 10 bytes)



    AU niveau code voici ce que j'ai fais dans un premier temps :
    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
     
    Socket socket = new Socket("xxx.xxx.xxx.xxx", 1234);
    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream();
     
    //Envoie data 1
    out.write(byteArray1);
    out.flush();
     
    //réception data 1
    byte[] bytes;
    bytes = in.readAllBytes();   // renvoie 3 byte
     
    //Envoie data 2
    out.write(byteArray2);
    out.flush();
     
    //réception data 2
    byte[] bytes;
    bytes = in.readAllBytes();    //renvoie 0 byte au lieu de 5
     
    ...
     
    out.close();
    int.close();
    socket.close();

    j'ai essayé de changer la partie lecture de l'inpustream suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //receive data 1
    byte[] bytes;
    bytes = in.readAllBytes();   // get 3 byte

    Par
    Changement N° 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int nRead;
    byte[] buffer = new byte[1024];
     
    while ((nRead = in.read(buffer , 0, buffer.length)) != -1) {
      baos.write(buffer , 0, nRead);
    }
    ou par
    Changement N° 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     byte[] buffer = new byte[1024];
     baos.write(buffer,0,in.read(buffer));
    mais cela ne change rien, l'inputStream est toujours vide après la première lecture.


    La seule façon que j'ai trouvé pour l'instant pour que cela fonctionne
    c'est d'utiliser un Thread.sleep avec le code du Changement N° 2, mais cela ne me semble pas une solution très propre.

    Par exemple ce code fait bien ce que je souhaite


    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
     
    Socket socket = new Socket("xxx.xxx.xxx.xxx", 1234);
    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream();
     
    //Envoie data 1
    out.write(byteArray1);
    out.flush();
     
    //réception data 1
     Thread.sleep(5000);  
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     byte[] buffer = new byte[1024];
     baos.write(buffer,0,in.read(buffer));    //je récupère bien 3 byte 
     
    //Envoie data 2
    out.write(byteArray2);
    out.flush();
     
    //réception data 2
     Thread.sleep(5000);  
     ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
     byte[] buffer2 = new byte[1024];
     baos2.write(buffer2,0,in.read(buffer2));    //je récupère bien 5 byte 
     
    ...
     
    out.close();
    int.close();
    socket.close();

    J'espère avoir été assez clair et ne pas m'être trompé de section du forum

    Merci d'avance de votre aide

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    Citation Envoyé par Bretzel67 Voir le message
    La seule façon que j'ai trouvé pour l'instant pour que cela fonctionne
    c'est d'utiliser un Thread.sleep avec le code du Changement N° 2, mais cela ne me semble pas une solution très propre.
    En effet, mais c'est parce que ce que tu cherches à faire n'est pas très propre.
    Les sockets connectées, ça ne s'utilise pas comme ça, c'est tout.

    Tu ne peux pas lire "le nombre d'octets envoyés". Une socket est un flux, il n'y a pas de nombre d'octets, il n'y a que les octets qui y passent. Tu sauras combien il y en avait, quand la socket est fermée par le serveur à la fin.

    Quand on veut une logique de requête/réponse, l'idée est de définir un protocole, grâce auquel on détecte dans le flux, où commencent et où terminent les réponses. On ne lit donc pas "autant d'octets que la réponse en contient", on lit jusqu'à ce que la fin de réponse soit détectée dans le flux.

    Cela dit, si tu veux espérer une logique comme celle que tu décris, ça ne marche pas trop mal de juste attendre après chaque envoi, que le serveur ait probablement fini d'envoyer tout ce qu'il avait à envoyer en réponse. Ce n'est pas propre, mais c'est vrai que ça se tient.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Problèmes de lecture/écriture sur deux sockets
    Par Popof dans le forum Linux
    Réponses: 2
    Dernier message: 26/11/2009, 23h14
  2. Problème de lecture/écriture avec les sockets
    Par mrttlemonde dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 09/10/2009, 11h12
  3. Problème de lecture avec les Socket
    Par Kevin12 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/03/2009, 15h40
  4. Réponses: 4
    Dernier message: 23/11/2008, 02h05
  5. [Socket] Problème de lecture flux danss communication
    Par tooney dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 06/06/2005, 11h08

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