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
    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 582
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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. 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