Probleme de communication de dataInputStream et dataOutputStream

Signaler
Messages postés
18
Date d'inscription
vendredi 27 décembre 2002
Statut
Membre
Dernière intervention
23 janvier 2003
-
Messages postés
18
Date d'inscription
vendredi 27 décembre 2002
Statut
Membre
Dernière intervention
23 janvier 2003
-
j'ai un souci lorsque je fais communiquer 2 flux
je cree un tableau de bytes, dedans j'y mets à la suite :
** une string que je convertis en bytes par getBytes()
** 1 tableau contenant des bytes
** Je finis par un caractère special '\r'
Quand je fais afficher la taille de ce tableau, j'y ai retrouve une taille de 4500 cases, je le mets dans mon dataOutputStream à l'aide de la méthode write()

De l'autre cote, dans mon dataInputStream, je lis entierement mon flux jusqu'a trouver mon caractere special '\r'...
Quand j'affiche le contenu de ce que j'ai lu, il n'y a qu'un seul symbole qui est le 1er caractere de mon dataOutPutStream... mais je n'ai pas la suite...

PS : j'ai essaye de flusher le dataOutputStream mais ca ne change rien !! %-6

merci de l'aide apportée

3 réponses

Messages postés
261
Date d'inscription
jeudi 5 septembre 2002
Statut
Membre
Dernière intervention
6 octobre 2005
11
Un peu de code sur l'écriture et la lecture nous permétrait de mieux t'aider.
JHelp
Messages postés
18
Date d'inscription
vendredi 27 décembre 2002
Statut
Membre
Dernière intervention
23 janvier 2003

Voici le code du cote client.. Je cherche a faire une commade "get" similaire a celle que l'on pourrait trouver sur un ftp. Je regarde la requete qui a ete tapee par l'utilisateur. J'envoie cette requete suivant un protocole bien defini au serveur. Si la requete est valide, le serveur renvoie une string l'indiquant au client. Si le client recoit cette string, il est en attente de donnes.

din et dout sont mes flux d'entrees et de sorties dans mes client/serveur.
_reponse est la chaine recuperee dans le din du client....

Bon courage :blush)

if (requete.equals("get")) {
System.out.println("Je suis rentre dans la commande get");
String arg2="";
boolean espace3 = false ;
int l = 4 ;
while ((!espace3) && (l<s.length())) {
String tempS = s.substring(l,l+1);
if (tempS.equals(" ")) espace3 = true;
else {
arg2 += tempS ;
l++;
} // fin else
} // fin while
requete = "4 "+arg2.length() +" "+arg2;
System.out.println("voici la requete qui est envoyee au serveur : " + requete);
buffer = requete.getBytes();
_dout.write(buffer,0,buffer.length);

_reponse = lectureDin(); // on recupere le resultat du get
System.out.println("Voici a quoi est egal la reponse : " + _reponse);
String idErrorStr = _reponse.substring(0,1);
System.out.println("Voici ce que contient idError : " + idErrorStr);
int idError = Integer.parseInt(idErrorStr);
if (idError != 0) {
String sizeErrorStr = jusquEspace(2);
int sizeErrorInt = Integer.parseInt(sizeErrorStr);
String messErreur = "";
l = 3 + sizeErrorStr.length();
for (int k = 0 ; k < sizeErrorInt ; k++)
messErreur += _reponse.substring(k+l,k+l+1);
System.out.println(messErreur);
}
else {
String fileNameSizeString = jusquEspace(2);
System.out.println("Voici ce que contient fileNameSizeString : " +fileNameSizeString);
int fileNameSize = Integer.parseInt(fileNameSizeString); // pour le controle de la decompressio
// on commence les appels de la commande getChunk
requete = "5";
buffer = requete.getBytes();
_dout.write(buffer,0,buffer.length);
int i = _din.read (buffer);
System.out.println("Valeur du i : " +i);
requete = new String (buffer, 0,i);
setReponse(requete); // lecture de _din
System.out.println("reponse contient :"+_reponse +" et sa taille est de : " + _reponse.length());
File fileRecu = new File(arg2);
if (jusquEspace(0).equals("1")) System.out.println("Erreur generique");
else {
String sizeChunkStr = jusquEspace(2);
System.out.println("Affichage de _reponse.substring(0,1) : " +_reponse.substring(0,1));
System.out.println("Affichage de _reponse.substring(2,3) : " +_reponse.substring(2,3));
System.out.println("Affichage de sizeChunkStr : " +sizeChunkStr);
int sizeChunkInt = Integer.parseInt(sizeChunkStr);
int pointeur= 3 + sizeChunkStr.length() ;
requete = "";
for (int copie = 0 ; copie < sizeChunkInt ; copie++)
requete += _reponse.substring(copie+pointeur,copie+pointeur+1);
//byte [] tampon = new byte [sizeChunkInt];
//_din.readFully(tampon);
//String tamponStr = new String(tampon,0,tampon.length);
FileWriter fw = new FileWriter (fileRecu);
fw.write(requete,0,requete.length());
fw.close();

=======================================
Voici le code cote serveur. l'entier 4 correspond a la commande get dans mon protocole. Je verifie que le fichier que le client veut telecharger existe ou que l'utilisateur a les droits suffisants. Si, ces conditions sont verifies, le servuer donne son accord au rappatriement des donnes au client. Puis le serveur commance à compresser le fichier grace a ma classe Compresseur.. Puis les envoie par morceaux de <=1Mo.

if ("4".equals(req.substring(0,1))) {
String s; // reponse a la requete
boolean espace = false;
int j = 2 ;
String sizeStringStr ="";
while ((!espace) && (j<req.length())){
String sizeTemp = req.substring(j,j+1);
if (sizeTemp.equals(" ")) espace = true;
else {
sizeStringStr += sizeTemp;
j++;
} // fin else
} //fin while
int sizeStringInt = Integer.parseInt(sizeStringStr);
j = 3 + sizeStringStr.length();
String fName = "";
for (int n = 0 ; n < sizeStringInt ; n++)
fName += req.substring(n+j,n+j+1);
System.out.println("Voici le nom du fichier demande : "+ fName);
File fileName = new File (repCourant+fName);
if (!fileName.exists()) s = "2 25 le fichier est inexistant";
else
if (!fileName.canRead()) s ="3 20 operation non permise";
else s = "0 "+ fileName.length();
bufferTemp = s.getBytes();
buffer2 = new byte [bufferTemp.length+1];
for (int p = 0 ; p= 1048576) sizeChunk = 1048576;
else {
sizeChunk = tailleDispo;
pasFini = false ;
}
byte[] data = new byte [sizeChunk];
comp.getSortie(data);
byte [] bufferTemp2 ;
byte [] buffer3;
System.out.println("Voila a quoi est egale la requete chez le serveur : "+ req);
System.out.println("Voila ce que contient la variable sizeChunk : "+ sizeChunk);
if (!req.equals("5")) { //je me demande si ce paragrape n'est pas inutile
s = "1 16 Erreur generique";
bufferTemp2 = s.getBytes();
buffer3 = new byte [bufferTemp2.length+1];
for (int az = 0 ; az <bufferTemp2.length ; az++)
buffer3[az] = bufferTemp2[az];
buffer3[buffer3.length-1] = (byte) '\r';
dout.write(buffer3,0,buffer3.length);
dout.flush();
} // fin if
else {
s ="0 "+sizeChunk+" ";
bufferTemp2 = s.getBytes();
byte finEmission = (byte) '\r';
buffer3 = new byte [bufferTemp2.length+data.length+finEmission];
for (int az = 0 ; az <bufferTemp2.length ; az++)
buffer3[az] = bufferTemp2[az];
for (int az2 = 0 ;az2 <data.length ; az2++)
buffer3[az2+bufferTemp2.length]=data[az2];
buffer3[buffer3.length-1]=finEmission;
System.out.println("Affichage du contenu de buffer3 : ");
for (int az = 0 ; az < buffer3.length ; az++)
System.out.print(buffer3[az]+" ");
System.out.println();
} // fin else
System.out.println("Voici la taille du dout.write que l'on balance : "+ buffer3.length);

dout.write(buffer3,0,buffer3.length);
dout.flush();
} //fin while
Messages postés
18
Date d'inscription
vendredi 27 décembre 2002
Statut
Membre
Dernière intervention
23 janvier 2003

en fait, voilà comment s'effectue la demande de telechargement...
1ere etape --> le client demande s'il p telecharger le fichier <fichier> au serveur
2eme etape --> le serveur verifie si tout est correcte, et lui renvoie sa réponse
3eme etape --> le client signale au serveur qu'il est pret a recevoir les octets
4eme etape --> le serveur commence a envoyer des donnees
5eme etape --> le client recoit les octets et les met dans un fichier

l'etape 5 et 4 peuvent se repeter de nombreuses fois suivant la taille du fichier...
Lorsque le client lit quelque chose sur son dataInputStream, il me t la reponse dans un attribut _reponse. Il se trouve que lors de l'etape 5, la chaine reponse ne contient que "0"... quoi qu'il arrive !! :(