2011-10-07 3 views
0

J'essaye d'écrire un serveur qui accepte des dossiers et l'écris dans certain répertoire using DataInputStream et BufferedInputStream. Le serveur reçoit 'nom d'utilisateur (chaîne)' 'nombre de fichiers (int)' 'nom du fichier (chaîne)' 'taille de chaque fichier (long)' et 'contenu du fichier qui n'est pas interprété octets (octet [ ]) 'java réseau-tuyau cassé et fichier reçu corrompu

et si tout est réussi alors, je suis censé envoyer une valeur booléenne.

Mais le problème est qu'il ne reçoit pas le fichier correctement.

De temps en temps, je reçois un message d'erreur 'tuyau cassé' ou le fichier est corrompu après réception.

Correction du problème ..

+0

double possible de [Comment réparer java.net.SocketException: Broken pipe] (http://stackoverflow.com/q/2309561/851811) –

Répondre

3

Une petite chose qui peut être liée à votre problème. Vous devez être décrémentation votre variable de taille du fichier par le nombre d'octets lus, au lieu du nombre d'octets demandé à lire:

 while(fileSize>0){ 
      if(fileSize < byteSize) 
       byteSize = (int)fileSize; 
      int byteRead = din.read(b, 0, byteSize); 
      fos.write(b); 
      fileSize -= byteRead; // <-- See here 
     } 
+0

+ 1 Il est probable que c'est le vrai problème derrière l'erreur. Si vous lisez moins d'octets que nécessaire, le programme peut quitter prématurément la boucle 'while' et obtenir la longueur de fichier suivante. Cela peut conduire à continuer à lire le flux d'entrée lorsqu'il n'y a plus de données. –

+0

Vous devriez également vérifier le résultat 'byteRead' et ne pas écrire le tableau de tampons entier à la sortie à chaque fois, mais seulement la quantité d'octets réellement lus. Sinon, vous pouvez écrire des sections des données lues dans la sortie deux fois. – Gandalf

+0

Il a résolu mon problème !!! Je vous remercie!! –

0

Vous pourriez obtenir cette erreur si la lecture de l'entrée, l'expéditeur ferme la connexion. Cela n'a probablement rien à voir avec votre code. L'expéditeur a peut-être expiré, fermé la connexion avant la fin du transfert ou bien d'autres choses.

Jetez un oeil à cette question connexe: How to fix java.net.SocketException: Broken pipe?