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
ou par
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); }
Changement N° 2
mais cela ne change rien, l'inputStream est toujours vide après la première lecture.
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));
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
Partager