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 :

[Socket]Transfert données + fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut [Socket]Transfert données + fichier
    Bonjour,

    Je souhaite transférer par socket des données et des fichiers
    Actuellement, je sais transférer des données avec un serveur ayant un code de ce genre-là
    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
      public void run()
      {
        try
        {
          BufferedReader entrée = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
          PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);
          boolean arrêter = false;
          while (!arrêter)
          {
            String ligne = entrée.readLine();
            if (ligne == null)
              arrêter = true;
            else
            {
              int ier = 0;
              String answer = "";
          }
          connexion.close();
        }
        catch (IOException e) { System.err.println(e); }
      }
    }
    Mais maintenant de souhaite transférer également des fichiers. Et là je rencontre un problème assez simple : si le fichier contient le caractère de fin de ligne, le code String ligne = entrée.readLine(); va faire que je ne traiterai pas le code complètement.

    J'ai vu dans un autre sujet ici
    comment transférer un fichier. OK mais dans mon cas, je dois transférer en même temps un fichier et des données relatives à ce fichier

    Une première solution serait de modifier le String ligne = entrée.readLine() avec un autre caractère pour ne pas m'arrêter au premier /n.
    Une autre solution serait d'adapter le WriteObject().
    Mais dans un cas comme dans l'autre, je ne sais pas comment faire

    Merci d'avance pour votre aide

  2. #2
    Membre habitué Avatar de Mathieu.Nanoux
    Étudiant
    Inscrit en
    Février 2004
    Messages
    166
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 166
    Points : 137
    Points
    137
    Par défaut
    pourquoi ne pas créer une classe qui contiendrait le renseignement du fichier et transformer le fichier en une variable contenu dans la classe et ecrire le tout avec le flux WriteObject.

  3. #3
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut
    Je ne vois pas très bien, peux-tu détailler un peu ton idée ?

  4. #4
    Membre habitué Avatar de Mathieu.Nanoux
    Étudiant
    Inscrit en
    Février 2004
    Messages
    166
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 166
    Points : 137
    Points
    137
    Par défaut
    mon idée serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Fichier implements serializable
    {
       //variable qui contiennent tes informations de fichier
       private String nom;
       private float taille;
       ...
     
       //Et une variable qui contient ton fichier
       private File monFichier;
       //ou
       private byte[] monFichier;
    }
    Seulement je pense que le type "File" ne transporte pas le fichier, il faudrais certainement le transformé en byte. A verifier.

  5. #5
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut
    Ton post a été l'occasion de me pencher sur la sérialisation : je regrette de ne pas l'avoir fait plus tôt mais cela va beaucoup m'aider

    Pour en revenir au sujet, cela marche beaucoup mieux et j'arrive à transporter le fichier. Effectivement, File ne transporte pas le fichier mais en le convertissant en byte[], c'est bon

    Par contre, je suis tombé sur un autre souci : c'est comme si je récupérais toujours le même objet

    Sur le serveur, j'ai ceci :
    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
     
    Dans le main :
    ----------------
          new ThreadConnexionSimple().start();
          new ThreadConnexionObject().start();
          while (true)
          {
              try
              {
                  Thread.sleep(100);
              }
              catch (Exception e)
              {
                  System.err.println(e);
              }
          }
     
     
    class ThreadConnexionObject extends Thread
    {
        private ServerSocket service;
     
        public ThreadConnexionObject()
        {
            try
            {
                service = new ServerSocket(Port);
            }
            catch (IOException e)
            { 
                System.err.println(e);
            }
        }
     
        public void run()
        {
            while (true)
            {
                try
                {
                    Socket connexion = service.accept();
                    ObjectInputStream 	in 	= new ObjectInputStream(connexion.getInputStream());
                    ObjectOutputStream 	out = new ObjectOutputStream(connexion.getOutputStream());
     
                    boolean arrêter = false;
                    while (!arrêter)
                    {
                        Object obj = in.readObject();
                        if (obj == null)
                            arrêter = true;
                        else
                        {
                            Object answer = null;
                            ...
                            out.writeObject(answer);
                            out.flush();
                        }
                    }
                    connexion.close();
                }
                catch (Exception e)
                {
                    System.err.println(e);
                }
            }
        }
    }
     
    C'est la même chose pour ThreadConnexionSimple
    Côté 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
     
    Dans l'initialisation faite une fois pour toutes :
    ----------------------------------------------------
           _socketSimple = new Socket(serverIp, serverPortSimple);
           _socketObject = new Socket(serverIp, serverPortObject);
     
           _simpleIn = new BufferedReader(new InputStreamReader(_socketSimple.getInputStream()));
           _simpleOut = _socketSimple.getOutputStream();
     
           try
           {
               _objectOut 	= new ObjectOutputStream(_socketObject.getOutputStream());
               _objectIn	= new ObjectInputStream(_socketObject.getInputStream());
           }
           catch (Exception e)
           {
               System.out.println(e);
           }
     
    Quand je veux récupérer un fichier depuis le serveur :
    ---------------------------------------------------------------
               _objectOut.writeObject(proposal);
               _objectOut.flush();
     
               while (true)
               {
                   Object obj = _objectIn.readObject();
                   ...
                   traitement
                   ...
                   break;
               }
    Je dois mal gérer mes sockets mais je ne sais pas trop où est l'erreur

    Merci d'avance pour votre aide

  6. #6
    Membre habitué Avatar de Mathieu.Nanoux
    Étudiant
    Inscrit en
    Février 2004
    Messages
    166
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 166
    Points : 137
    Points
    137
    Par défaut
    tu veux dire koi par le meme objet ?

  7. #7
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut
    Disons que côté client j'ai un objet que j'envoie vers le serveur une première fois et l'objet réceptionné est identique à celui envoyé.
    Ensuite je modifie l'objet côté et je le renvoie. Côté serveur, l'objet que je récupère est identique à la première réception et ne contient pas les modifications apportées. :

  8. #8
    Membre habitué Avatar de Mathieu.Nanoux
    Étudiant
    Inscrit en
    Février 2004
    Messages
    166
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 166
    Points : 137
    Points
    137
    Par défaut
    Il me semble que tes connexions réseaux sont juste. Faudrais verifier que l'objet que tu modifie est bien celui que tu envoie. Si tu passe par une fonction, voir si tu envoie le bon.

  9. #9
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut
    J'y suis allé au debuggueur et j'ai pu regarder les valeurs de tous les attributs de l'objet et il est bien différent des deux côtés

  10. #10
    Membre habitué Avatar de Mathieu.Nanoux
    Étudiant
    Inscrit en
    Février 2004
    Messages
    166
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 166
    Points : 137
    Points
    137
    Par défaut
    oki, c'est bon alors maintenant ...

  11. #11
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut
    hein : on a du mal se comprendre parce que ce n'est pas bon du tout : l'objet côté client est bel et bient différent de celui côté serveur

  12. #12
    Membre habitué Avatar de Mathieu.Nanoux
    Étudiant
    Inscrit en
    Février 2004
    Messages
    166
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 166
    Points : 137
    Points
    137
    Par défaut
    oki, excuse, j'avais pas compris dans ce sens là .

    Bizarre ca. Je reflechis à quoi ca peut correspondre. Là je dois partir, si j'ai trouvé qqch, je te repondrais dès que je reviens.

  13. #13
    Membre habitué Avatar de Mathieu.Nanoux
    Étudiant
    Inscrit en
    Février 2004
    Messages
    166
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 166
    Points : 137
    Points
    137
    Par défaut
    tu saurais mettre la partie du code cote client a partir du moment ou tu fais des modif's jusque quand tu l'envoie?

  14. #14
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut
    J'ai trouvé la solution mais alors c'est vraiment le genre de truc, si tu ne le sais pas, tu ne risques pas de trouver: c'est bel et bien le même objet qui est transmis et voici l'explicarton :
    Churchill Objects: Sending the Same Object Again

    Comme je n'ai pas le temps d'implementer cloneable sur tous les objets que je souhaite transferer et comme j'ai implémenté partour le concstructeur par copie, j'ai juste fait un new de mon objet avant chaque envoi et le problème est résolu

    Merci beaucoup pour ton support, cela m'a permis de continuer à chercher

  15. #15
    Membre habitué Avatar de Mathieu.Nanoux
    Étudiant
    Inscrit en
    Février 2004
    Messages
    166
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 166
    Points : 137
    Points
    137
    Par défaut
    oki, extra, il me semblait bien que les connexions reseau etait bonne et que l'erreur etait du avec une histoire d'objet .

    Bonne continuation dans ton programme.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/12/2008, 23h42
  2. [socket] Transfert de fichier, Bug d'envoi des BYTE
    Par mnemonic78 dans le forum C#
    Réponses: 1
    Dernier message: 14/06/2008, 18h22
  3. Socket: transfert de fichiers
    Par timtima dans le forum Réseau
    Réponses: 5
    Dernier message: 28/11/2007, 12h54
  4. [Sockets] transfert de fichier client/serveur
    Par alex6891 dans le forum Développement
    Réponses: 6
    Dernier message: 20/03/2006, 16h14
  5. [Socket]Transfert de fichier
    Par Aminos dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 19/04/2003, 13h58

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