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

Java Discussion :

[Echange fichiers] Problème selon taille fichier


Sujet :

Java

  1. #1
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut [Echange fichiers] Problème selon taille fichier
    Bonjour à tous,

    voilà j'ai une appli. client/serveur qui fonctionne via TCP.

    J'aimerai permettre l'échange de fichiers. Celui-ci marche mais uniquement pour des fichiers de certaines tailles (+/- 4ko...) après quoi, si je transfère, par exemple, un .rar de 10mo, j'obtiens 0 octets à l'arrivée...
    J'ai fait pas mal de recherches, mais je ne comprends toujours pas pourquoi cette limite.

    Voici mon code:

    (le serveur envoie au client)

    Code de l'envoi du fichier (coté 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
                File toSend = new File(userPrefModel_.getPref()[1]+"\\"+askedFile);     
                DataInputStream dataInput = null;
                try{
                    dataInput=new DataInputStream((new FileInputStream(toSend)));
                }catch(FileNotFoundException e){
                    e.printStackTrace();
                }
                try{
                    byte i=dataInput.readByte();
                    DataOutputStream dataOutput = new DataOutputStream(clientOutput_);
                    while(i!=-1){
                        dataOutput.writeByte(i);
                        i=dataInput.readByte();
                    }
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
    code de la réception du fichier (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
     
            DataOutputStream out = null;       
            try{
                out = new DataOutputStream(new FileOutputStream(f));
            }catch(FileNotFoundException e){
                e.printStackTrace();
            }
            DataInputStream dataInput = new DataInputStream(inputStream_);
            try{
                byte b = dataInput.readByte();
                while(b!=-1){
                    out.write(b);
                    b = dataInput.readByte();
                }
            }catch(Exception e){
                e.printStackTrace();
            }

    Une idée? :s


    merci

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Tu dois avoir un peu de lag sur ta connexion. Ta méthode pour savoir si le flux est terminé côté client n'est pas bonne. Il faut faire plusieurs essais avant de fermer le flux. De plus, il faut lire un tableau au lieu de byte par byte.
    Essai avec cette algo 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
     
    DataOutputStream out = null;       
            try{
                out = new DataOutputStream(new FileOutputStream(f));
            }catch(FileNotFoundException e){
                e.printStackTrace();
            }
            DataInputStream dataInput = new DataInputStream(inputStream_);
            try{
                byte[] lire = new byte[ 1024 ];
                int taille = 0;
                int essai = 0;
                while( essai < 10 || ( taille = dataInput.read( lire ) ) > 0 )
                {
                    if( taille > 0 )
                    {
                            out.write( lire, 0, taille );
                            essai = 0;
                    }
                    else
                    {
                            ++essai;
                            try { Thread.sleep( 100 ); }
                            catch( InterruptedException exc ) {}
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
            }
    Tu peux affiner le temps de pause.
    Il faut également écrire les données par bloc dans le serveur. Inspire-toi du client ci-dessus.

  3. #3
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    Merci pour ta réponse,

    je viens de faire plusieurs tests et voici le problème:

    Si je transfère par exemple un fichier de 3,2 ko, je me retrouve avec un de 4ko à l'arrivée.

    Je suppose donc une lecture trop longue par rapport à la taille du fichier, mais comment savoir quand s'arrêter? merci

    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
     
            DataOutputStream out = null;       
            try{
                out = new DataOutputStream(new FileOutputStream(f));
            }catch(FileNotFoundException e){
                e.printStackTrace();
            }
            DataInputStream dataInput = new DataInputStream(inputStream_);
            try{
                byte[] lire = new byte[ 1024 ];
                int taille = 0;
                int essai = 0;
                taille = dataInput.read(lire);
                while (essai<50 || (taille > 0))
                {
                   if( taille > 0 )
                    {
                            out.write( lire, 0, taille );
                            essai = 0;
                    }
                    else
                    {
                            ++essai;
                            try { Thread.sleep( 1000 ); }
                            catch( InterruptedException exc ) {}
                    }
                    taille = dataInput.read(lire);
                } 
                out.close();
            }catch(Exception e){
                e.printStackTrace();
            }
    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
     
     File toSend = new File(userPrefModel_.getPref()[1]+"\\"+askedFile);     
                DataInputStream dataInput = null;
                int size = 0;
                try{
                    dataInput=new DataInputStream((new FileInputStream(toSend)));
                }catch(FileNotFoundException e){
                    e.printStackTrace();
                }
                try{
                    byte[] bb = new byte[1024];
                    int i=dataInput.read(bb);
                    DataOutputStream dataOutput = new DataOutputStream(clientOutput_);
                    while(i!=-1){
                        dataOutput.write(bb);
                        i=dataInput.read(bb);
                    } 
                    dataOutput.close();                
                }catch(IOException e){
                    e.printStackTrace();
                }
    merci encore

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Le code du serveur n'est pas bon. Il ne gère pas la taille réellement lue du tableau. Donc le dernier tableau lu est envoyer intégralement, même s'il n'est rempli qu'à moitié.
    Il suffisait pourtant d'adapter le serveur en fonction du code du client que j'ai donné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    byte[] bb = new byte[1024];
    int taille = 0;
    DataOutputStream dataOutput = new DataOutputStream(clientOutput_);
     
    while( ( taille = dataInput.read( bb ) ) > 0 )
    {
      dataOutput.write( bb, 0, taille );
    }
    De plus, un temps de pause d'une seconde est un peu long dans un réseau "normal". Car on arrive à 50 secondes après 50 essais !
    Le nombre d'essais est également trop élevé.
    "essais * pause" ne devrait pas dépasser 2 à 5 secondes environ.

  5. #5
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    En effet, comment ai-je pu passer à côté du fait que le dernier byte[] evnoyé n'était pas rempli...



    bref,

    pour le Thread.sleep et les essais, c'était un test en rapport avec le programme en lui-même


    merci

  6. #6
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    Par contre je vais devoir adapter "essai" en fonction de la taille du fichier.

    Si je transfère un fichier de 150mo, essai devra e^tre très élevé...

    je vais plancher là-dessus

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Tuxico Voir le message
    Par contre je vais devoir adapter "essai" en fonction de la taille du fichier.

    Si je transfère un fichier de 150mo, essai devra e^tre très élevé...

    je vais plancher là-dessus
    Non justement ! La taille du fichier n'a rien à voir avec le nombre d'essais.
    Lorsqu'une lecture du client est un succès, le nombre d'essais est remit à zéro. Le nombre d'essais est sur un tableau de bytes, par sur la totalité d'un fichier.

  8. #8
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    ok je comprends mieux


    merci pour ton temps

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

Discussions similaires

  1. [PowerShell] Lister dans un fichier le chemin de fichier aillant une taille de 0KB
    Par lsda26 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 19/03/2015, 15h46
  2. Réponses: 4
    Dernier message: 31/07/2006, 09h31
  3. Réponses: 1
    Dernier message: 26/04/2006, 12h01
  4. 1 fichier PHP ou 3 fichier PHP selon langue
    Par icecube216 dans le forum Langage
    Réponses: 4
    Dernier message: 15/12/2005, 12h31
  5. [langage] Problème de taille de fichier à mettre dans
    Par And_the_problem_is dans le forum Langage
    Réponses: 10
    Dernier message: 13/08/2002, 09h41

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