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 :

Problème de transfert de fichier en JAVA


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 2
    Par défaut Problème de transfert de fichier en JAVA
    Svp aidez moi à trouver l'erreur:

    j'ai 3 classe ici. je n'ai pas mis les classes interface:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    package envoi_fichier;
     
    import static envoi_fichier.Transfert.transfert;
    import java.io.*;
    import java.net.*;
     
    public class Serveur2 {
        public Serveur2() {
            String fichier_recu="t";
            try {
                    ServerSocket ss = new ServerSocket(7000);
                    System.out.println("le serveur est en attente de connexion!");
                    Socket s =ss.accept();
                    FileInputStream is =(FileInputStream) s.getInputStream();
     
                    System.out.println("Connexion etablie ok!");
                    System.out.println("reception du fichier en cours!");
                    BufferedInputStream buff= new BufferedInputStream(is);
     
                    BufferedReader in=new BufferedReader(new InputStreamReader(buff));
     
                    fichier_recu=in.readLine();
                    System.out.println(fichier_recu);
     
                    transfert(s.getInputStream(),new FileOutputStream("F:\\beans\\serveur\\"+fichier_recu), true);
                    System.out.println("Fichier reçu!");
                    System.out.println("Chemin du fichier: F:\\beans\\serveur\\"+fichier_recu);
     
            } catch (IOException e) {
            }
        }
    }

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    package envoi_fichier;
     
    import static envoi_fichier.Transfert.transfert;
    import java.io.*;
    import java.net.*;
    import java.nio.file.Path;
     
     
    public class Envoie {
     
            public  String repertoire;
            public  String ip;
            public  int chaine_port;
     
     
        public Envoie(String repertoire, String ip, int chaine_port) {
     
            super();
              try{
                Socket s=new Socket(ip, chaine_port);
     
                transfert(new FileInputStream(repertoire),s.getOutputStream(),true);
     
                s.close(); 
                System.out.println(repertoire);
                System.out.println("Transfert terminé!");
              }catch(IOException e){
            }
        }
    }
    La classe Transfert:
    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
     
    package envoi_fichier;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
     
     
    public class Transfert {
     
               public static void transfert(InputStream is, OutputStream os, boolean closeOnExit) throws IOException{
     
                  byte buf[] = new byte[1024];
     
                  int n;
                  while((n=is.read(buf))!=-1)
                  os.write(buf,0,n);
     
                  if (closeOnExit){
                    is.close();
                    os.close();
                  }
              } 
     
    }
    L'attribut réception est censé êrtre le fichier reçu du serveur, mais le serveur me renvoie 'null'.

    Merci de m'aider.

    Voici le résultat chez le serveur:

    le serveur est en attente de connexion!
    Connexion etablie ok!
    reception du fichier en cours!
    null
    Fichier reçu!
    Chemin du fichier: F:\beans\serveur\null

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par Bertrand3 Voir le message
    Voici le résultat chez le serveur:...
    Il est trompeur de caster le flux de la socket en FileInputStream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Socket s =ss.accept();
    FileInputStream is =(FileInputStream) s.getInputStream();
    parce qu'il ne s'agit en aucun cas du contenu d'un fichier. L'implémentation est SocketInputStream. Et le contenu du flux est ce que le client écrit dedans. Et le cast compile et la lecture du contenu fonctionne (compile et exécute) parce que SocketInputStream hérite de FileInputStream.

    Ensuite, ton code envoie le contenu d'un fichier, et ton serveur lit le flux en utilisant ce qui est lu comme nom de fichier (alors que c'est le contenu d'un fichier). Le contenu peut être un nom de fichier, certes. Mais si tu veux pouvoir avoir le nom du fichier, lut dans le client et envoyé, côté serveur, il faut que le client lui envoie. Et si tu veux envoyer le contenu dans le même flux, ensuite, il faut un moyen pour distinguer les deux parties. Ce qui peut être un passage à ligne : la première ligne sera le nom du fichier, les autres le contenu, et ton code serveur sera alors adapté à ce format.

    Penser également à l'existence/absence du dossier f:\beans\serveur. L'appel de file.getParentFile().mkdirs() t'évitera ce probèmes.

    Actuellement, si System.out.println(fichier_recu); affiche null, c'est qu'il n'y a rien à lire dans le flux, donc in.readLine() retourne null. Je suppose que le fichier côté client est vide, donc rien est écrit par le client dans le flux.
    Et en conséquence, le nom du fichier côté serveur est "F:\\beans\\serveur\\null".


    Ne laisse jamais de bloc catch vide : fait un minimum pour tracer l'exception, sinon, s'il y en a une tu ne le sauras pas.

    Au minimum écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            } catch (IOException e) {
                e.printStackTrace();
            }
    Et gère mieux tes fermetures de flux, de tous les flux et y compris en cas d'erreur. Sans fermeture de flux, tu risques d'avoir des fichiers verrouillés, ou partiels sur disque, ou des contenus non complètement envoyés (pas de flush, donc les données sont encore dans les tampons). Le moyen le plus simple étant d'utiliser un try-with-ressources.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Problème de transfert de fichier à l'aide d'un web service
    Par Theoden dans le forum Services Web
    Réponses: 0
    Dernier message: 23/02/2009, 21h19
  2. problème de transfert de fichier
    Par Z3phur dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 09/10/2008, 16h10
  3. [Upload] Problème de transfert de fichier
    Par bidibou dans le forum Langage
    Réponses: 4
    Dernier message: 21/07/2008, 14h07
  4. Problème de transfert de fichier avec webutil
    Par aznkd dans le forum Forms
    Réponses: 5
    Dernier message: 06/06/2008, 17h03
  5. [MFC] Problème de transfert de fichier
    Par poseidon2 dans le forum MFC
    Réponses: 2
    Dernier message: 08/07/2005, 09h25

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