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][Byte] Probleme d'envoi d'une taille de fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 80
    Points : 67
    Points
    67
    Par défaut [Socket][Byte] Probleme d'envoi d'une taille de fichier
    bonjour !
    J'ai une appli client serveur , ou le serveur envoi un fichier, j'ai vu paser un topic sur le forum parlan de JProgressBar et ca me serai utile de l'integrer dan mon appli
    J'aimerai lintegrer de la maniere suivante : indiquer la taille du fichier deja envoyé
    mai pour ca il faut que le serveur envoi d'abor au client la taille du fichier, et c'est la tou le problem, pour mes essai mon fichier fai 40795 caracteres exactement mais lors d'une utilisation réellees, il devrai non pa faire 40Ko mai
    13Mo....
    J'utilise BufferedOutputStream et BufferedInputStream
    jenvoi mes donnée avec write(byte[ ])
    le probleme est que je convertit la taille du fichier en byte :

    byte taille = (new Long (monFichier.length()).byteValue();

    Le probleme est que je ne recupere pa la taille du fichier...
    je recupere 91

    j'avai contourné le probleme une premiere foi en envoyant mon fichier byte par byte, comme ca dan le client je navai pa besoin de connaitre la taill du fichier... mais la ell est indispensable
    est ce qqn aurait une idée sur comment envoyer la taille d'un fichier par le reseau?
    AMD Athlon XP2800+ Barton
    Carte mère MSI K7N2 Delta-L
    CG MSI Radeon RX9800Pro TD-128
    1go DDR2700 Samsung

    Windows XP SP1

  2. #2
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Un byte est trop petit pour contenir la taille d'un fichier.

    Essai ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    // Ecriture
    long size = ... // la taille du fichier
    String taille = "#" + size + "#";
    out.write(taille.getBytes());
    Pour la lecture tu lis byte par byte jusqu'au deuxieme # et ensuite tu parse la chaine entre # pour en faire un long ...

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 80
    Points : 67
    Points
    67
    Par défaut
    J'ai un peu modifier cette partie parce que dans le client je doi creer un tableau de byte mai je ne connai pa la taille qu'il aura...
    J'ai pa ecnore verifié qu'il marchai, j'ai un autre probleme en cours ^^
    (vive les threads)
    je met quand meme un tag Resolu parce que je pense que ca va marche
    merci bien
    AMD Athlon XP2800+ Barton
    Carte mère MSI K7N2 Delta-L
    CG MSI Radeon RX9800Pro TD-128
    1go DDR2700 Samsung

    Windows XP SP1

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 80
    Points : 67
    Points
    67
    Par défaut
    Ce code me pose probleme o nivo de la lecture...
    en effet je doi faire un entree.read(tmp)
    ou tmp est un byte [ ] qui doi recevoir le byte [ ] contenant la taille

    mais pour faire ca je doi instancier tmp, et donc connaitre la taille du tableau que j'envoi...je tourne en rond
    AMD Athlon XP2800+ Barton
    Carte mère MSI K7N2 Delta-L
    CG MSI Radeon RX9800Pro TD-128
    1go DDR2700 Samsung

    Windows XP SP1

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 80
    Points : 67
    Points
    67
    Par défaut
    Personne n'a d'idées?
    AMD Athlon XP2800+ Barton
    Carte mère MSI K7N2 Delta-L
    CG MSI Radeon RX9800Pro TD-128
    1go DDR2700 Samsung

    Windows XP SP1

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    jsui pas une star en java mais ja i deja du envoyer des fichier entre client serveur et ben j ai fait une methode de bourrin quoi
    j avais pecho la taille du fichier, avait envoye un string contenant la taille avec methode writeUTF(string) et readUTFassocie et ensuite j avias envoye byte par byte. J avais certainement du close le stream entre deux

    bon c bourrin mais c etait pour un TP donc ....... tant que ca marche on passe a la suite

    ps; je sais pas si j ai bien cerné toin probleme par contre

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 80
    Points : 67
    Points
    67
    Par défaut
    Si ssi c'est bien ca mon probleme
    mais le 2eme truk c'est que je suisen entreprise et ce genre de solution bourrin il vau miu les laisser de coté
    et de+ le writeUTF n'est pas dan BufferedOutputStream ou alor g mal regardé
    AMD Athlon XP2800+ Barton
    Carte mère MSI K7N2 Delta-L
    CG MSI Radeon RX9800Pro TD-128
    1go DDR2700 Samsung

    Windows XP SP1

  8. #8
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Voici l'implementation de ce que je t'avais conseille, mais que cela ne devienne pas une habitude

    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
     
          // Envoi de la taille
          long size = 12345;
          String rep = "#" + size + "#";
          OutputStream stream = ...
          stream.write(rep.getBytes());
     
          // Lecture de la taille
          InputStream in = null;
          // state = 0 : rien de lu
          // state = 1 : lu un premier #
          // state = 2 : lu le deuxieme #
          int state = 0;
          char c = 0;
          StringBuffer buf = new StringBuffer();
          while (state != 2)
          {
            c = (char) in.read();
            switch (state)
            {
              case 0 :
                if (c == '#')
                {
                  state = 1;
                }
                else
                {
                  System.out.println("Erreur de protocol: ca dot commencer par #");
                }
                break;
              case 1 :
                if (c == '#')
                {
                  state = 2;
                }
                else
                {
                  // lecture de la taille
                  buf.append(c);
                }
                break;
            }
          }
          long taille = 0;
          try
          {
            taille = Long.parseLong(buf.toString());
          }
          catch (NumberFormatException e)
          {
            System.out.println("format de taille incorrect");
          }
    Une fois la taille lue tu peux continuer a utiliser le InputStream pour lire le reste des donnees...

    Un conseil: si tu veux pouvoir lire des fichiers volumineux, c'est toujours mieux de lire buffer par buffer et d'ecrire les buffers au fur et a mesure dans le fichier destination ...

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 80
    Points : 67
    Points
    67
    Par défaut
    desolé
    pour ce qui est du code je l'ai implementé, mais mon probleme c'est le read()...
    avec la methode que tu utilise, tu envoie un tableau de byte [ ]...
    or a l'endoir ou je li, j'utilise donc ma methode read( )

    mais la specif c'est int read( byte [ ] b )
    pour faire mon read je doi donc lui donner un tableau de byte, mai ce tableau de byte doit etre instancié a la taille tu talbeau que je lui ai envoyé...

    je ne sais pas si je suis clair...

    ah pour ce qui est de l'ecriture du fichier ell march parfaitement
    j'envoya effectivement byte par byte
    comme ca je pouvai deja instancié mon talbeau pour le read
    mais la g besoin de la taille car j'ai besoin de faire une JProgress bar
    AMD Athlon XP2800+ Barton
    Carte mère MSI K7N2 Delta-L
    CG MSI Radeon RX9800Pro TD-128
    1go DDR2700 Samsung

    Windows XP SP1

  10. #10
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Ton probleme c'est quoi alors : De transmettre la taille : Ou de lire le fichier :

    Le bout de code que je t'ai passe ecrit la taille du fichier sur la socket entre #

    La deuxieme partie lit cette taille depuis la socket et la convertie en long.

    Rien ne t'empeche d'utiliser read() (lecture d'un byte a la fois) au debut de ta lecture sur la socket et ensuite de faire un read(byte[]) pour lire les donnees du fichier ...

    Peu importe la facon dont tu ecris tes bytes, un par un ou par tableau, tu les lis comme tu l'entends (un par un ou par tableau) de l'autre cote ...

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 80
    Points : 67
    Points
    67
    Par défaut
    Mon probleme est l'envoi de la taille du fichier
    Comme je disais au debut je voulai aussi faire comme ca pour lire mon fichier
    finalement j'ai contourné le probleme et lenvoi et la reception du fichier march tres bien
    mai maintenan je me suis mi dans la tete de mettre une JProgressBar
    il fau donc que j'ai la taille du fichier
    jai donc bien fai comme tu me l'avai conseillé pour lenvoi de la taille
    et pour essayer, g enlevé l'envoi du fichier, et la reception du fichier,
    je n'ai mi que 2 read() a la suite l'un de l'autre
    avec un affichage de ce que g lu a chaque foi, mais je ne recoit rien.
    et autre question que je me posai sur le flux il y a un tableau de byte [ ] qui set envoyé, si je fai un simple read, est ce qu'il va lire une petite partie de ce tableau et le tableau sera "supprimé du flus" ou alor sil restera la tant que je ne l'aurai pas lu en entier?
    AMD Athlon XP2800+ Barton
    Carte mère MSI K7N2 Delta-L
    CG MSI Radeon RX9800Pro TD-128
    1go DDR2700 Samsung

    Windows XP SP1

  12. #12
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    La lecture sur une socket marche comme la lecture dans un fichier, le curseur de lecture se deplace automatiquement a chaque lecture ..

    Par exemple si tu ecris un tableau de 10 bytes mais que tu lis le premier byte seulement, la prochaine lecture commencera au deuxieme byte du tableau ...

    En rajoutant les sockets au bout de code que je t'ai file tu devrais obtenir une taille de 12345 sur le client, je ne comprend pas ou est ton probleme ...

    Peux-tu montrer le bout de code qui fait l'emission de la taille et le bout de code qui fait la reception, ca m'aidera peut-etre a comprendre ..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 80
    Points : 67
    Points
    67
    Par défaut
    daccor, je vai faire ma petite lecture byte par byte maintenan que c un peu plu clair, o pire si ca march pas je ferai une RAZ de mon prog
    enfin bon normalement avec tout ce que tu m'as donné ca devrai marcher corectement
    merci en tou cas
    AMD Athlon XP2800+ Barton
    Carte mère MSI K7N2 Delta-L
    CG MSI Radeon RX9800Pro TD-128
    1go DDR2700 Samsung

    Windows XP SP1

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 80
    Points : 67
    Points
    67
    Par défaut
    Ca march nickel merci bcp
    desolé de tavoir pri tro de temps

    je vai regarder maintenan pourquio je n'ai pa reussi plu rapidement...
    AMD Athlon XP2800+ Barton
    Carte mère MSI K7N2 Delta-L
    CG MSI Radeon RX9800Pro TD-128
    1go DDR2700 Samsung

    Windows XP SP1

  15. #15
    Membre régulier Avatar de Kevin12
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par bulbo Voir le message
    Rien ne t'empeche d'utiliser read() (lecture d'un byte a la fois) au debut de ta lecture sur la socket et ensuite de faire un read(byte[]) pour lire les donnees du fichier ...
    Est ce qu'il y'a un moyen de connaître le nombre de byte réellement lu ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/05/2015, 18h14
  2. Probleme d'Envoi d'une plage filtre vers word
    Par laurent27530 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/11/2014, 22h39
  3. Probleme d'envoie d'une reponse HTTP.
    Par gregb34 dans le forum C++
    Réponses: 1
    Dernier message: 19/04/2008, 15h49
  4. Réponses: 2
    Dernier message: 10/01/2008, 03h24
  5. [toFAQ][socket] Envoi d'une structure
    Par julien20vt dans le forum C++
    Réponses: 15
    Dernier message: 23/04/2003, 15h47

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