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

Langage Java Discussion :

Sockets .. envoie de fichiers endomagé


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Par défaut Sockets .. envoie de fichiers endomagé
    Bonjour tout le monde
    Voila mon problémé j'ai commencé a travaillé avec les sockets .j'ai essayé de transferer des fichier via les sockets . mais lorsque je veux ouvrir le fichier transféré par exemple (.doc ou .pdf) je le trouve endomagé
    NB: je peux seulement ouvrir les fichiers transféré sous format "fichier.txt" est ce que vous avez une idée
    Merci d'avance
    voila mes class

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    package serv3;
     
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Date;
     
    public class Client extends Thread
    {
     public Client()
     {
      this.start();
     }
     
     public void run()
     {
      try
      {
       //envoiSimple();
       envoiFichier();
      }
      catch (Exception e) {e.printStackTrace();}
     }
     
     private void envoiSimple() throws UnknownHostException, IOException
     {
      Date t = new Date();
     
      Socket socketClient = new Socket("127.0.0.1", 8008);
         DataInputStream in = new DataInputStream(socketClient.getInputStream());
         DataOutputStream out = new DataOutputStream(socketClient.getOutputStream());
     
         // Creation d'un tampon de stockage
      byte[] buffer_receive = new byte[1024];
     
         for (int i = 0; i < 10 * 1024; i++)
         {
          out.write(buffer_receive);
          out.flush();
     
          in.read();
         }
     
         out.write("END".getBytes());
         out.flush();
     
         System.out.println("Transfert de 10 Mo en " + (new Date().getTime() - t.getTime()));
     }
     
     private void envoiFichier() throws UnknownHostException, IOException
     {
      Date t = new Date();
     
      Socket socketClient = new Socket("localhost", 8008);
         DataInputStream in = new DataInputStream(socketClient.getInputStream());
         DataOutputStream out = new DataOutputStream(socketClient.getOutputStream());
     
     
      // ouverture de flux sur le fichier à envoyer
         RandomAccessFile fic = null;
      int tailleF = 0;
     
     
         fic = new RandomAccessFile ("c:\\salah.rar","rw");
         tailleF = (int) fic.length();
     
     
         // quelques initialisations     
      byte[] buffer_send = new byte[1024]; // buffer de lecture dans le fichier
         int fichierfini = -1; // == 0 lorsque le fichier aura été entièrement envoyé
     
     
         while (fichierfini !=0)
      {
       // Lecture du fichier d'entrée dans le buffer
       int octets_lus = 0; // nombre d'octets lus
       octets_lus = fic.read(buffer_send, 0, buffer_send.length - 4);
     
     
     
          out.write(buffer_send);
          out.flush();
     
     
          in.read();
     
       // teste si le fichier source a été entièrement parcourru
       fichierfini = (int) (fic.length() - fic.getFilePointer());
      }
     
      // Boucle d'envoi terminée : soit envoi fini, soit erreur
         out.write("END".getBytes());
         out.flush();
     
      // Dans tous les cas, fermeture du fichier en lecture
      fic.close();
      in.close();
      out.close();
     
         float tps = (new Date().getTime() - t.getTime()) / 1000F;
         if (tps == 0) tps = 1;
     
         System.out.println(tailleF + " octets copiés en " + (new Date().getTime() - t.getTime()) + "ms");
     }
    }


    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    package serv3;
     
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.RandomAccessFile;
    import java.net.ServerSocket;
    import java.net.Socket;
     
    public class Serveur extends Thread 
    {
     public Serveur()
     {
      this.start();
     }
     
     public void run()
     {
      try
      {
        ServerSocket socketEcoute = new ServerSocket(8008);
        Socket socketClient = socketEcoute.accept();
     
           DataInputStream in = new DataInputStream(socketClient.getInputStream());
           DataOutputStream out = new DataOutputStream(socketClient.getOutputStream()); 
     
           RandomAccessFile fluxSortie = new RandomAccessFile("d:\\salah.rar","rw");
     
           String message = "";
           while (!message.equals("END"))
           {     
         // Creation d'un tampon de stockage
         byte[] buffer_receive = new byte[1024];
     
         // Lecture du message sur le flux d'entree
         int size_msg = 0;
     
         size_msg = in.read(buffer_receive, 0, buffer_receive.length);
     
         fluxSortie.write(buffer_receive);
     
         if (size_msg >= 0)
          message = new String(buffer_receive, 0, size_msg); 
     
         if (!message.equals("END"))
         {
          out.write("OK".getBytes());
          out.flush();      
         }
           }
       }
       catch(Exception e) {}
      }
    }
    et le main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package serv3;
     
    public class Main 
    {
       public static void main(String[] args) 
       {  
          new Serveur();new Client();  
       }
    }

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       octets_lus = fic.read(buffer_send, 0, buffer_send.length - 4);
     
     
     
          out.write(buffer_send);
          out.flush();

    tu ne tiens pas compte de "octets_lu" alors que, clairement, buffer_send n'est pas plein (taille max -4 dans ton code au maximum). Donc en pratique, dans le "meilleurs" des cas, tu envoie à chaque fois 4 0 à la fin en trop (que le serveur joyeusement récupère et ajoute dans le fichier).

    Code correct:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       octets_lus = fic.read(buffer_send, 0, buffer_send.length - 4);
          out.write(buffer_send,0,octets_lus);
          out.flush();
    Même commentaire pour la lecture coté serveur.
    PS à améliorer:
    • je ne vois pas l'intérêt de ce "-4"
    • je ne vois pas comment dans ton code, tu es sur de recevoir le "END" . Tu pexu très bien recevoir plein de caca avec le end au bout, vu ton code
    • tu écrit le "END" dans le fichier destination, il a rien à y faire
    • tu ne supporterais pas un fichier qui contiendrais le texte "END" dedans

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Par défaut
    j'ai corrigé le client et le serveur mais toujours le meme probleme est ce que vous avez une idée

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    donne ton code modifié

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Par défaut
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    package serv3;
     
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Date;
     
    public class Client extends Thread
    {
     public Client()
     {
      this.start();
     }
     
     public void run()
     {
      try
      {
       //envoiSimple();
       envoiFichier();
      }
      catch (Exception e) {e.printStackTrace();}
     }
     
     private void envoiSimple() throws UnknownHostException, IOException
     {
      Date t = new Date();
     
      Socket socketClient = new Socket("127.0.0.1", 8008);
         DataInputStream in = new DataInputStream(socketClient.getInputStream());
         DataOutputStream out = new DataOutputStream(socketClient.getOutputStream());
     
         // Creation d'un tampon de stockage
      byte[] buffer_receive = new byte[1024];
     
         for (int i = 0; i < 10 * 1024; i++)
         {
          out.write(buffer_receive);
          out.flush();
     
          in.read();
         }
     
         out.write("END".getBytes());
         out.flush();
     
         System.out.println("Transfert de 10 Mo en " + (new Date().getTime() - t.getTime()));
     }
     
     private void envoiFichier() throws UnknownHostException, IOException
     {
      Date t = new Date();
     
      Socket socketClient = new Socket("localhost", 8008);
         DataInputStream in = new DataInputStream(socketClient.getInputStream());
         DataOutputStream out = new DataOutputStream(socketClient.getOutputStream());
     
     
      // ouverture de flux sur le fichier à envoyer
         RandomAccessFile fic = null;
      int tailleF = 0;
     
     
         fic = new RandomAccessFile ("c:\\salah.pdf","rw");
         tailleF = (int) fic.length();
     
     
         // quelques initialisations     
      byte[] buffer_send = new byte[1024]; // buffer de lecture dans le fichier
         int fichierfini = -1; // == 0 lorsque le fichier aura été entièrement envoyé
     
     
         while (fichierfini !=0)
      {
       // Lecture du fichier d'entrée dans le buffer
       int octets_lus = 0; // nombre d'octets lus
       octets_lus = fic.read(buffer_send, 0, buffer_send.length - 4);
     
     
          //modification apporté
          out.write(buffer_send,0,octets_lus);
          out.flush();
     
     
          in.read();
     
       // teste si le fichier source a été entièrement parcourru
       fichierfini = (int) (fic.length() - fic.getFilePointer());
      }
     
      // Boucle d'envoi terminée : soit envoi fini, soit erreur
         out.write("END".getBytes());
         out.flush();
     
      // Dans tous les cas, fermeture du fichier en lecture
      fic.close();
      in.close();
      out.close();
     
         float tps = (new Date().getTime() - t.getTime()) / 1000F;
         if (tps == 0) tps = 1;
     
         System.out.println(tailleF + " octets copiés en " + (new Date().getTime() - t.getTime()) + "ms");
     }
    }

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    package serv3;
     
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.RandomAccessFile;
    import java.net.ServerSocket;
    import java.net.Socket;
     
    public class Serveur extends Thread 
    {
     public Serveur()
     {
      this.start();
     }
     
     public void run()
     {
      try
      {
        ServerSocket socketEcoute = new ServerSocket(8008);
        Socket socketClient = socketEcoute.accept();
     
           DataInputStream in = new DataInputStream(socketClient.getInputStream());
           DataOutputStream out = new DataOutputStream(socketClient.getOutputStream()); 
     
           RandomAccessFile fluxSortie = new RandomAccessFile("d:\\salah.pdf","rw");
     
           String message = "";
           while (!message.equals("END"))
           {     
         // Creation d'un tampon de stockage
         byte[] buffer_receive = new byte[1024];
     
         // Lecture du message sur le flux d'entree
         int size_msg = 0;
     
         size_msg = in.read(buffer_receive, 0, buffer_receive.length);
     
         fluxSortie.write(buffer_receive,0,size_msg);
     
         if (size_msg >= 0)
          message = new String(buffer_receive, 0, size_msg); 
     
         if (!message.equals("END"))
         {
          out.write("OK".getBytes());
          out.flush();      
         }
           }
       }
       catch(Exception e) {}
      }
    }
    est ce que vous pouvez me proposé des modification car je suis blocké
    Merci

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    -> ma remaque sur la présence du END dans la réponse est toujours valable, tu n'a rien fait pour le corriger, ca pollue ton fichier destination
    -> faire un new String () d'un array de byte quelconque est très dangereux, ca peut lancer des exceptions!
    -> retire ce et remplace le, au minimum, par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    catch(Exception e) {e.printStackTrace();}
    -> ton in.read() du coté envoi ne sert à rien, ton serveur, de l'autre coté, n'écrit jamais sur sont outpustream, tu ne peux donc rien avoir à recevoir.

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

Discussions similaires

  1. [Socket] envoi de fichier
    Par danje dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 03/05/2008, 18h22
  2. Envoi de fichier par socket
    Par dr_octopus74 dans le forum Réseau
    Réponses: 42
    Dernier message: 19/01/2007, 17h59
  3. [socket] probleme d'envoi de fichier
    Par soulhouf dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 21/10/2005, 16h15
  4. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58
  5. [Socket]envoie de fichier!!!
    Par SamDaKap dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2002, 08h07

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