Partage
  • Partager sur Facebook
  • Partager sur Twitter

Envoyer GROS fichier via socket

ca marche pas :(

Sujet résolu
Anonyme
    24 mars 2010 à 18:12:56

    Bonjour à tous,

    pour un système de "chat" avec envoie de fichier, je n'arrive pas par socket à envoyer des fichiers "lourd" ( qui dépasse la centaine de Ko ). J'ai eu l'idée de décomposer mes fichiers en plusieurs parties de fichier que j'envoie à la chaine ( et à la réception j'écrit dans mon fichier à la suite ).

    Le problème est que :

    -> J'envoie par exemple un fichier de 2Mo
    -> A la réception, j'ai bien mon fichier de 2Mo
    =+> Mais impossible de l'ouvrir ( si c'est une image, gimp affiche une erreur et ne peut ouvrir le fichier !)

    Par conséquent, je pense qu'il y a une erreur dans l'envoie et dans la recopie du fichier .... mais uniquement quand ce dernier est découpé ( si il y a qu'une partie a envoyé tout marche )...

    C'est pourquoi je suspecte très fortement la RECEPTION ( et non l'ENVOI ) mais je met quand même pour comprendre "grosso modo".


    ENVOIE
    private void boutonFichierActionPerformed(java.awt.event.ActionEvent evt) {                                              
            // TODO add your handling code here:
              try {
    
                 //Create a file chooser
                final JFileChooser fc = new JFileChooser();
    
                //In response to a button click:
                int returnVal = fc.showOpenDialog(boutonFichier);
    
                 if(!(returnVal == JFileChooser.APPROVE_OPTION)) {
                     System.out.println("cancel");
                    }
                 else {
                 
    
                 File file = fc.getSelectedFile();
    
                 int nbrPartieFile = (int)file.length()/10000+1;
                 System.out.println(nbrPartieFile);
    
                     byte[] b = new byte[(int) file.length()];
                     try {
                        FileInputStream fileInputStream = new FileInputStream(file);
                        fileInputStream.read(b);
    
                        } catch (FileNotFoundException e) {
                        System.out.println("File Not Found.");
                        e.printStackTrace();
                        }
                        catch (IOException e1)
                        {
                        System.out.println("Error Reading The File.");
                        e1.printStackTrace();
                     }
    
    
                     int finData;
                     // on envoie pls bout de fichier
                    for(int p=0; p < nbrPartieFile; p++) {
                        if((int)file.length()-10000*(p+1)<0) {
                            finData = (int)file.length()-10000*(nbrPartieFile-1);
                             System.out.println("merde");
                        }
                        else
                            finData = 10000;
    
                     byte[] tabToSend = new byte[finData];
    
                        //System.out.println(finData);
                        // System.out.println(file.length());
                        // System.out.println((int)file.length());
    
                        System.out.println(finData);
    
                        for(int s=0; s < finData; s++)
                            tabToSend[s] = b[s*(p+1)];
                        System.out.println(tabToSend.length);
                        Message mess = new Message(Message.FICHIER, pseudo, pseudoDest, tabToSend, b.length,file.getName(),nbrPartieFile-p); // a verifier b.length ?!
                        chatGlobal.Send(mess);
                        try {
                            Thread.sleep(300);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                        }
    
                        System.out.println(p);
                    }
    
              
                 }
            }
            catch (NullPointerException ex) {
                System.out.printf("Merci de rentrer un message");
            }
    
        }
    


    Voila, grosso modo je découpe mon fichier en partie de 10000octets et j'envoie le tout par une méthode standard de socket.


    LA RECEPTION
    else if (msg.getType() == Message.FICHIER) {
    
               String pseudoMess =  new String(chatGlobal.msg.getNicksource());
               String pseudoDestMess =  new String(chatGlobal.msg.getNickdestination());
    
                    String nomF = new String(chatGlobal.msg.getNomFile());
                    int taille = chatGlobal.msg.getTailleFile();
                    int nbrPart = chatGlobal.msg.getNbrPart();
    
                    File monFichier = new File(nomF);
    
    
                try {
                        if(!monFichier.exists())
                        monFichier.createNewFile(); // Cette fonction doit être appelée au sein d'un bloc TRY
    
    
                } catch (IOException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }
                    
                try {
    
                      java.io.FileOutputStream monFluxFichier;
                    if(monFichier.length() == taille){
                        monFluxFichier = new java.io.FileOutputStream(monFichier); // on efface si deja present
                    }
                    else {
                        monFluxFichier = new java.io.FileOutputStream(monFichier,true); //  LE TRUE POUR APPEND
                    }
    
                monFluxFichier.write(chatGlobal.msg.getContenu());
                System.out.println(nbrPart);
                System.out.println(monFichier.length());
    
               
                // fin du fichier recu on ferme
    
                monFluxFichier.close(); // Toujours dans un TRY
    
                Message messRep = new Message(Message.MESSAGE,  chatGlobal.msg.getNickdestination(),chatGlobal.msg.getNicksource(), "Le fichier a bien été transféré !");
                
                chatGlobal.Send(messRep);
                }
                catch (IOException FileNotFoundException)
                {
                System.out.println("Impossible de trouver le fichier");
                }
    
    
    
    
             }
    


    Je sais que le code comme ça est assez indigeste, mais si j'en donne pas vous allez me dire de le mettre. Et malheureusement je ne peux pas tout mettre car c'est un projet qui date depuis un long moment donc le code a coté est assez lourd ... Juste je pense pas que ce soit un probleme d'envoie mais plutot d'écriture dans un fichier quand plusieurs parties ...


    Voila si vous voyez donc une erreur plus particulièrement sur la manipulation des fichiers lors de la réception, je suis preneur ... A noter que je reste ouvert à toutes questions ( si vous voulez que je montre plus de code essayer d'être précis ^^ ).

    Merci énormément d'avance,
    Dahevos


    Edit : j'ai refait des test avec un fichier text ... les premières "parties" marchent mais soudainement pouf tout devient illisible...
    Je suspecte donc des messages arrivant avant d'autres messages ...ce qui foire le fichier : possible ? Pourtant j'ai mis un thread.sleep(600) ds mon deuxieme test mais ca change rien ! :( (même avec un 1000 ca change rien :( et ca bloque tjr au meme endroit ! )


    Résolu : j'ai utilisé readFully ... :)
    • Partager sur Facebook
    • Partager sur Twitter

    Envoyer GROS fichier via socket

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown