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

Java Discussion :

Probleme avec un Client Serveur de fichier


Sujet :

Java

  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Par défaut Probleme avec un Client Serveur de fichier
    Bonjour,

    je réalise de le cadre de mes études un Client - Serveur de fichiers.
    Le probleme: les fichiers BINAIRES envoyés de l'un vers l'autre sont corrompus tandis que les fichiers .txt ne le sont pas.
    Prenon la situation du transfére Client ->vers-> Serveur:
    metton que le nom du fichier soit connu a l'avance (je vais pas mettre tout le code pour pas fair trop lourd)

    algo java du client:(volontairement sans controle d'exception)
    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
    BufferedReader br    = null;   //Reader sur la socket
    PrintWriter pw       = null;    //Writer sur la socket
    FileInputStream fis  = null;   //Entrèe sur un fichier
    FileOutputStream fos = null; //Sortie sur un fichier
    
    File theFile = new File(filename);
    fileSize = theFile.length();
    fis = new FileInputStream(theFile);
    
    // Envoi de la taille du fichier sur la socket
    pw.println(new Long((fileSize)).toString());   
    pw.flush();
    
    for (long i=0;i<fileSize;i++){
       pw.write(fis.read());
    }
    pw.flush();   
    fis.close();
    
    //a savoir que d'aprés la doc fis.read() renvoi un int compris en 0 et 65535 pour une valeur lu entre 0 et 0xffff (en gros que les octets sont interprétés comme des int)
    Algo java du 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
     
    BufferedReader br    = null; //Reader sur la socket
    PrintWriter pw       = null; //Writer sur la socket
    FileInputStream fis  = null; //Entrèe sur un fichier
    FileOutputStream fos = null; //Sortie sur un fichier
     
    fos = new FileOutputStream(filename);
    // Reception de la taille du fichier sur la socket
    long fileSize = Long.parseLong(br.readLine());
    // Reception des octets.
    for (long i=0;i<fileSize;i++) 
                     fos.write(br.read());
     
    fos.close();
    ////////////////////////////////////FIN d'algo
    Le souci c'est que les fichiers autre que txt sont corrompu alors j'ai fai un petit programme cpp pour comparait un a un les octets des deux fichier (celui avant et celui aprés transfére) et j'observe que les octets 0x9y et 0x8y avec y un caractére hexa quelconque, sont remplacer systématiquement par 0x3f
    a noté également que tous les transfére d'un méme fichier correcte donnent des fichiers corompu identiques (donc les octet reçu ne sont pas du hasard)

    comment fair pour transférer correctement les octets d'un fichier binaire, et ainsi restituer une copi parfaite du fichier de l'autre coté?

  2. #2
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    a savoir que d'aprés la doc fis.read() renvoi un int compris en 0 et 65535 pour une valeur lu entre 0 et 0xffff (en gros que les octets sont interprétés comme des int)
    Dans ma doc à moi j'ai :
    Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned...
    comment fair pour transférer correctement les octets d'un fichier binaire, et ainsi restituer une copi parfaite du fichier de l'autre coté?
    Utiliser un flux binaire à la place d'un flux caractères ?

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Par défaut
    je suis entiérement dacor, alors justement comment modifier mon code actuel pour Utiliser un flux binaire à la place d'un flux caractères ?

  4. #4
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    En remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BufferedReader br    = null; //Reader sur la socket
    PrintWriter pw       = null; //Writer sur la socket
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BufferedInputStream br    = null;
    BufferedOutputStream pw       = null;
    et en arrangeant le protocole concernant la transmission de la taille du fichier.

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Par défaut
    je teste sa dessuite, j'en profite pour préciser que j'ai oublier de mettre les new mais c'est pas grave. on admet qu'ils existent entre la déclaration et l'utilisation des méthodes

  6. #6
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Par défaut
    Merveilleux, ça marche comme je le désire !
    Merci beaucoup

  7. #7
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Par défaut
    Je vien de m'apercevoir d'un détaille inatendu:
    les fichiers binaire se transfére parfaitement (méme crc) sauf que maintenant les fichiers .txt son éroné...
    faut-il tester le type de fichier a transféré, et choisir ensuite le flux aproprié?

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Idéalement, il faut demander à l'utilisateur quel est le type de fichier (binaire/texte) et ouvrir un flux en utilisant cette information : *Reader pour les fichiers textes et *InputStream pour les fichiers binaires.

    Enfin, c'est surtout le cas lors de transferts de fichiers entre systèmes peu compatibles (Mac <--> Windows par exemple).

  9. #9
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Par défaut
    En fait ce n'est pas les fichiers texte mais les fichiers de taille inférieur au kilo octet qui se transmettent mal. donc résolu.

  10. #10
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Par défaut
    Citation Envoyé par dingoth Voir le message
    Idéalement, il faut demander à l'utilisateur quel est le type de fichier (binaire/texte)
    dans cette idée, je pense que le mieux serais plutôt de trouver un moyen d'identifier le type du fichier et aviser en conséquent de façon automatique sans avoir a embéter l'utilisateur pour ça.
    je serais donc intéressait si quelqu'un aurait cette astuce.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Par exemple les fichiers transférés par FTP n'ont pas cette notion : c'est bel et bien à l'utilisateur de déterminer la méthode de transmission de ces fichiers : binaire ou texte.

  12. #12
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Par défaut
    Comme c'est cruel ! Comme si on pourrais vouloir envoyer un fichier binaire en mode texte...

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

Discussions similaires

  1. [C] Probleme avec socket client-serveur TCP
    Par LinuxUser dans le forum Réseau
    Réponses: 33
    Dernier message: 15/05/2007, 22h26
  2. Réponses: 4
    Dernier message: 10/10/2006, 12h20
  3. [C#] Probleme de connection client/serveur
    Par Myfred dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/10/2006, 19h29
  4. probleme d'application client-serveur en vb6 et SQL server
    Par maxtin dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 15/08/2006, 14h19
  5. probleme avec la lecture d'un fichier
    Par guiillaume63 dans le forum Langage
    Réponses: 2
    Dernier message: 12/07/2006, 08h44

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