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

Entrée/Sortie Java Discussion :

Transmission d'un fichier (serveur --> client)


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut Transmission d'un fichier (serveur --> client)
    Bonjour,

    je développe en ce moment une petite application client/serveur qui permettra de jouer une animation (fichiers musicaux, images, etc...), mais je bloque au niveau de la transmission des fichiers du serveur au client.

    Je n'ai pour l'instant essayé qu'avec des fichiers .mp3, tous les fichiers sont bien transmis, et les fichiers réceptionnés par le client ont la bonne taille, durée, etc... Le seul problème, et quand même de taille, est que la musique est incorrecte par rapport à l'originale (dans mon cas, elle ne s'arrête pas correctement), et donc le fichier a été corrompu pendant la transmission.

    Voilà mon code pour l'échange de fichier :

    Code serveur :
    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
    byte[] buffer=new byte[512*1024];
    int nbLus;
     
    try {
    	FileInputStream srcFile = new FileInputStream(new File(file.getAbsolutePath());
     
    	while((nbLus=srcFile.read(buffer)) != -1){
    		System.out.println(nbLus);
    		output.writeInt(nbLus);
    		output.write(buffer);
    	}
    	output.writeInt(Protocol.END_OF_FILE);
     
    } catch (FileNotFoundException e) {
    	// TODO Auto-generated catch block
    	e.printStackTrace();
    }catch(IOException e){
    e.printStackTrace();
    }
    Code client :
    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
     
    byte[] buffer = new byte[512*1024];
    int sizeBufferRead;
    int nbLus;
     
    try {
    	FileOutputStream srcFile = new FileOutputStream(fieldPath.concat(fileName));
     
    	while((sizeBufferRead = input.readInt()) != Protocol.END_OF_FILE){
    		//On récupère le buffer
    		input.readFully(buffer);
    		//On ecrit dans le fichier
    		srcFile.write(buffer);
    	}
     
    } catch (IOException e) {
    	// TODO Auto-generated catch block
    	e.printStackTrace();
    }
    Les input et output sont respectivement de type DataInputStream et DataOutputStream et sont simplement les flux d'entrée et de sortie associés à la socket de communication.

    Quelqu'un verrait d'où peut venir le problème ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Pour t'assurer que c'est bien une corruption de fichier (ça m'étonne dans ce cas précis), calcule pendant l'émission le CRC32 ou le MD5 ou autre de ton fichier d'entrée, mets cette valeur en début de fichier.
    Ensuite, lors de la réception, calcule à nouveau la valeur encodée du fichier que tu reçois (en enlevant les quelques octets d'encodage) et compare la valeur encodée à celle du fichier d'entrée.
    Si c'est la même, alors c'est surement un problème sur ton poste récepteur qui n'arrive pas à lire les mp3.
    Si ce n'est pas le même, eh bien il y a effetcivement eu un problème lors de la transmission étant donné que le mp3 est du binaire. Si tu transmets un fichier au format ASCII (style un .txt), as-tu le même problème ?
    Transmets-tu des fichiers de bécane Windows à bécane Windows ? Ca ne serait pas un problème d'octet de taille poids fort/poids faible style Little/Big Endian ?

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Deux remarques :
    • Tu ne fermes pas tes flux
      Comment libérer proprement les ressources ?
    • Tu écris toujours la totalité du buffer, même si tu as lu moins d'éléments. Il y a de forte chance que la dernière écriture contiennent des bytes en trop...
      Es-tu vraiment sûr que la taille des fichiers est identiques à l'octet près ???


    a++

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut
    Merci pour vos réponses !

    En fait, je ne transmet pas d'un ordi à l'autre mais simplement pour l'instant d'un processus à l'autre sur la même machine (donc même OS). Je n'ai pas encore testé avec un fichier txt mais je vais voir ce que ça donne.

    Sinon tu as raison adiguba, je vais faire ça proprement, en fermant les flux et en écrivant uniquement ce qui est lu, mais est-ce qu'il existe une fonction pour écrire un nombre donné d'octets du tableau passé en paramètre ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut
    Hop, j'ai fermé les proprement les flux comme décrit dans le tutorial et utilisé la fonction write(byte[], int, int) pour indiquer le nombre d'octets à écrire, et... ça marche

    Merci à vous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/03/2008, 16h39
  2. Comment envoyer un fichier d'un client au serveur
    Par opiece dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 13/02/2008, 11h50
  3. comment envoyer un fichier d'un client vers un serveur
    Par nad30 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 22/05/2007, 13h55
  4. Réponses: 16
    Dernier message: 01/03/2007, 17h31
  5. Réponses: 4
    Dernier message: 19/07/2006, 12h29

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