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 :

Envoi de fichier par socket


Sujet :

Entrée/Sortie Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Envoi de fichier par socket
    bnjr
    j ai besoin d aide je veux envoyer des fichiers dans un réseau (utilisant les sockets)
    mais j ai tester toutes les solutions et r1 ne fonctionne c ma derniere tentative et elle ne fonctionne pas
    le code suivant est dans le tread de client lorsqu il reçoit un Objet de type FICH (FICH classe serialiser contient un attribut fe type File)
    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
    if (o instanceof FICH) {
                    F = (FICH) o;
                    try {
                        fi = F.FIN;
                        f=new FileInputStream(fi);
                        fo=new FileOutputStream(fc.c.num);
                        byte[] buf = new byte[1024];
                        f.read();
     
                       System.out.println("reçu  "+fi);
                    int n;int i=1;
                        System.out.println("debut d ecriture"); 
                         while((n=f.read(buf))==1024){                        
                              fo.write(buf,0,n);
                              System.out.println("ecriture N° "+i);
                                i++;
            }
    //        //et la on ajoute les bytes plus petits que 1024 ) la fin            
                        fo.write(buf,0,n);
                        System.out.println("la dernier ecriture");
                        f.close();
                        fo.close();
                    } catch (Exception ex) {
                        System.out.println(ex + " erreur d ecriture");
                        ex.printStackTrace();
                    }
    c'est l'affichage dans la console du client

    Nom : consoleClient.png
Affichages : 670
Taille : 141,9 Ko

    et le fichier contient les byte mais il m affich ça

    Nom : FICHIER.png
Affichages : 654
Taille : 243,3 Ko
    svp aidez moi
    merci

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((n=f.read(buf))==1024)
    Le test correct est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((n=f.read(buf))>=0)
    on teste tant que la valeur de retour n'est pas négative. Seule une valeur de -1 indique une fin de fichier.

    Ensuite sérialiser un objet de type File est inutile. Tout ce que ton code fait actuellement c'est copier une fichier d'un dossier du client vers un autre dossier du client. La seule chose qui est transférée entre le serveur et le client, c'est le nom du fichier. File ne contient pas le contenu du fichier, juste son chemin d'accès. Si tu veux transférer un fichier du serveur vers les clients, tu lit les bytes coté serveur, tu écrit ces bytes sur la socket, tu relit ces bytes coté client et tu les écrit dans le fichier d'arrivée.

    PS: un effort pour nommer correctement tes variables dans ton code en respectant les conventions java, et un autre effort pour écrire autre chose que du language SMS dans tes questions, ce ne serait pas du luxe.

  3. #3
    Candidat au Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    merci
    j'ai essai de faire cette solution de lire les byte puis les écrire dans la socket coté serveur et les reçu du coté client puis les écrire dans le fichier d'arrivée mais
    le thread de client reçoit des objets donc cette solution ma générer une exception


    et a propos le code du test il ne marche pas

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le code du test marche très bien, c'est le reste de ton code qui fait n'importe quoi. Poste nous ton serveur et ton client corrigés pour qu'on vois tes erreurs.

  5. #5
    Candidat au Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    j'ai essayé cette solution est elle fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class CONTENU implements Serializable{
     
        int compteur;
        Vector tabbit=new Vector();
        CONTENU(){
     
    }
     
    }


    coté serveur : (lorsqu'il reçoit une demande de telecharegement )
    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
    //////la reception du nom de fichier voulez le telecharger
                       if (o instanceof fichier) {
                         f = (fichier) o;
                    try {
                        fis=new FileInputStream(f.chemin);
                           buf = new byte[1024];
                           int n = 0;
                           int compteur=0;
                           FCONTENU=new CONTENU();
                            while ((n = fis.read(buf)) >= 0) {
                                FCONTENU.tabbit.add(buf);
                                FCONTENU.compteur=compteur;
                                compteur++;
                                buf = new byte[1024];
     
                            }
                            System.out.println("terminée !");
                            fs.gc.sortie.writeObject(FCONTENU);
                            System.out.println("ENVOYEE !"); 
                            fis.close();
                    } catch (Exception ex) {
                        System.out.println(ex+" erreur d envoi ");
                        ex.printStackTrace();
                    }
     
                    }
    coté client : (la reception du fichier)
    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
     if (o instanceof  CONTENU) {
                    FCONTENU =(CONTENU)o;
                     System.out.println("reçu !");
                    try {
                        fos=new FileOutputStream(fc.c.num);
                       for(int i=0;i<FCONTENU.tabbit.size();i++){
                                   buf  = (byte[]) FCONTENU.tabbit.elementAt(i);
                                   fos.write(buf);
     
                       } 
                        System.out.println("terminée !");
                       fos.close();
                    } catch (Exception ex) {
                        System.out.println(ex + " erreur d ecriture");
                        ex.printStackTrace();
                    }
                }

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ça marche pas si bien que ça.

    • Essaie avec des fichiers textes, tu verras qu'ils se retrouvent avec des trucs tout bizarres à la fin.

      C'est bien d'avoir une variable n dans while ((n = fis.read(buf)) >= 0) { mais tu dois aussi t'en servir, sinon c'est comme si elle était pas là.

    • Essaie avec des fichiers de 500Mo. Ça fait mal, hein ?

      C'est parce que tu le charges entièrement en mémoire. Ce n'est pas malin de faire ça avec des fichiers, il faut les envoyer par bouts.
      Par exemple rien ne t'oblige à faire en sorte qu'un fichier soit envoyé en entier sous forme d'un seul objet. Tu pourrais avoir un objet "là j'envoie un fichier" puis plein d'objet "un bout du fichier" puis un objet "le fichier est fini".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ouais, mais non, même en envoyant bout par bout, avec un OnbjetOutputStream, ça va faire mal à la mémoire car ObjectOutputStream et ObjhectInputStream gardent un cache de tous les objets qui passent par là. Ce n'est tout simplement pas fait pour envoyer des fichiers. Point. Si tu veux envoyer un fichier tu prend la socket, tu prend l'outputstream de la socket et t'envoie le tout là dedans, sans créer un ObjectOutputStream qui sert à rien.

    Pour lire un fichier entièrement:

    http://java.developpez.com/faq/java/...FICHIER_copier

    Pour créer un socket, tu as visiblement déjà le code. Il te faut juste supprimer l'objetOutputStream qui se trouve dessus, et écrire toi même les données dans la socket. Eventuellement, la classe DataOutputStream / DataInputStream t'aidera à standardiser l'envoi des chaine de caractère et nombres faisant partie de ton protocole.

Discussions similaires

  1. Envoi de Fichier par Socket
    Par devalender dans le forum WinDev
    Réponses: 2
    Dernier message: 20/06/2008, 12h59
  2. Envoie de fichier par socket
    Par eracius dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 05/10/2007, 11h21
  3. Envoi de fichier par socket
    Par thebloodyman dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 30/08/2007, 17h07
  4. Envoi de fichier par socket
    Par dr_octopus74 dans le forum Réseau
    Réponses: 42
    Dernier message: 19/01/2007, 17h59
  5. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58

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