Appllet Java problème lors de connexion ftp

Appllet Java problème lors de connexion ftp - Java - Programmation

Marsh Posté le 15-03-2009 à 18:46:51    

Bonjour,
 
   Je suis en train de réaliser une applet d'upload ftp et je souhaite afficher une barre de progression pendant l'upload des fichiers.
 
  Je crée une classe principale qui dans la méthode init crée un bouton avec un actionlistener qui dès qu'il est enfoncé ouvre un jfile chooser. Une fois le fichier sélectionneé, je lance un swing worker dans une classe à part.
 
    Le doinbackground de ce swing worker crée un socket et se connecte à un serveur ftp distant pour uploader le fichier. Le problème est que l'applet fonctionne très bien dans l'applet viewer de eclipse mais plante au moment de la connexion socket. Tout se passe bien jusqu'à ce que la connexion se fasse puis plus rien.
 
   D'où peut venir ce problème.
 
Merci d'avance de votre réponse.
 
mon main:

Code :
  1. public void init(){
  2.        
  3.     this.setSize(300, 80);
  4.         this.setBackground(Color.darkGray);
  5.  //On centre le texte du JLabel et on écrit en bleu...
  6.        
  7.  //On ajoute nos composants
  8.  this.getContentPane().setBackground(Color.GRAY);
  9.  this.getContentPane().add(bouton, BorderLayout.SOUTH);
  10.  //Et le tour est joué !
  11.   
  12.      // Lors de l'appui sur le bouton, on crée un Jfile chooser qui va permettre de choisir le fichier à uploader
  13.      this.bouton.addActionListener(new ActionListener(){
  14.   public void actionPerformed(ActionEvent arg0) {
  15.    // On crée un JFileChooser pour choisir le fichier à uploader
  16.                chooser = new JFileChooser();// On ouvre une boite de sélection de fichiers
  17.                               chooser.setApproveButtonText("Uploader" );
  18.                   chooser.setDialogTitle("Uploader" ); //On change les noms de la boite de sélection
  19.                   chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//On permet de choisir des  fichiers seulement
  20.               
  21.             
  22.    try
  23.    {
  24.    if(chooser.showOpenDialog(chooser) == JFileChooser.APPROVE_OPTION) {//Si on a appuyé sur le bouton ok pour choisir le fichier
  25.      
  26.        
  27.        try {
  28.        File dir = new File(chooser.getSelectedFile().getAbsolutePath());//On crée un fichier à partir du chemin sélectionné dans le JFile Chooser
  29.          
  30.           boolean isDir = dir.isDirectory(); //On vérifie si ce fichier est un dossier (en l'occurence il ne l'est pas mais c'est pour une utilisation future de cet applet
  31.           if (isDir)//Si c'est un dossier on l'upload
  32.           {
  33.         //ftp.uploadDirectory(chooser.getSelectedFile().getAbsolutePath());// On upload le dossier
  34.              
  35.                           
  36.           }
  37.           else // si le fichier sélectionné est un fichier, on l'upload
  38.           {
  39.            FileInputStream in = new FileInputStream(chooser.getSelectedFile().getAbsolutePath());// On initialise les flux de données
  40.            /*fttp.stor(chooser.getSelectedFile().getAbsolutePath(),in, chooser.getSelectedFile().getName());
  41.              
  42.            */uploadTaskbis tb= new uploadTaskbis(chooser.getSelectedFile().getAbsolutePath(),in, chooser.getSelectedFile().getName());
  43.                                
  44.             /*ftp.uploadFile(chooser.getSelectedFile().getAbsolutePath(), chooser.getSelectedFile().getName());
  45.              */
  46.               
  47.           }
  48.              
  49.              
  50.       } catch (Exception ftpe) {
  51.        JOptionPane poij = new JOptionPane();
  52.        poij.showMessageDialog(null,ftpe.getMessage(), "Connexion interrompue", JOptionPane.ERROR_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi
  53.       } finally {
  54.       }
  55.     }
  56.    }
  57.    catch(java.lang.IndexOutOfBoundsException p)
  58.    {
  59.    }
  60.    catch(java.lang.NullPointerException p)
  61.    {
  62.    }
  63.       }
  64.       });
  65. }


 
Ma task swing worker :

Code :
  1. class Task extends SwingWorker<Void, Void> {
  2.         /*
  3.          * Main task. Executed in background thread.
  4.          */
  5.         @Override
  6.         public Void doInBackground() { // Cette tache se connecte au serveur et éffectue l'upload de fichiers
  7.            
  8.             try
  9.             {
  10.            
  11.             
  12.            
  13.                   fttp=new SimpleFTP();
  14.                    [#FF0E00][/#FF0E00]fttp.connect(TestApplet.getSERVEUR(),21,TestApplet.getUSER(),TestApplet.getPASSWORD());
  15.                    fttp.bin();
  16.                   fttp.cwd("administrateur" );
  17.                   fttp.cwd("uploads" );
  18.                 
  19.                   Le programme ne semble plus rien faire à partir d'ici
  20.                       f = new File(filelocal);//on récupère la taille du fichier
  21.                   size = (int)f.length();
  22.                        
  23.                  
  24.                
  25.                 SwingUtilities.invokeLater(new Runnable()  //AFFICHER UNE NOTIFICATION D'ECHEC DANS l'EDT
  26.                   {
  27.                 public void run()
  28.                         {
  29.                 
  30.                JU.addWindowListener(WL);//Permet de détecter si la fenêtre est fermée et arrêter ainsi le téléchargement en passant à false la variable uploadOk              
  31.                         JU.setProgressMax(size);// on prépare la JProgressBar
  32.                             JU.setVisible(true);
  33.                             JU.setSizeUploaded("Télachargé : 0kB of "+ size /1000 +" kB" );
  34.                         JU.setTimeRemaining("Temps restant : 00:00:00 (à 0 Octets/s)" );
  35.                         JU.setTimeElapsed("Temps écoulé : 00:00:00" );
  36.                         JU.setInfoUpload("Upload de "+f.getName() + " (1 of 1)" );
  37.                        
  38.                         }
  39.                   });
  40.                
  41.                 BufferedInputStream input = new BufferedInputStream(inputStream);
  42.                  fttp.sendLine("PASV" );
  43.                 String response = fttp.readLine();
  44.                if (!response.startsWith("227 " )) {
  45.                   throw new IOException("SimpleFTP could not request passive mode: "
  46.                       + response);
  47.                 }
  48.                 String ip = null;
  49.                 int port = -1;
  50.                 int opening = response.indexOf('(');
  51.                 int closing = response.indexOf(')', opening + 1);
  52.                 if (closing > 0) {
  53.                   String dataLink = response.substring(opening + 1, closing);
  54.                   StringTokenizer tokenizer = new StringTokenizer(dataLink, "," );
  55.                  
  56.                   try {
  57.                     ip = tokenizer.nextToken() + "." + tokenizer.nextToken() + "."
  58.                         + tokenizer.nextToken() + "." + tokenizer.nextToken();
  59.                     port = Integer.parseInt(tokenizer.nextToken()) * 256
  60.                         + Integer.parseInt(tokenizer.nextToken());
  61.                   } catch (Exception e) {
  62.                     throw new IOException("SimpleFTP received bad data link information: "
  63.                         + response);
  64.                   }
  65.                 }
  66.               fttp.sendLine("STOR " + filename);
  67.                 Socket dataSocket = new Socket(ip, port);
  68.          
  69.                 response = fttp.readLine();
  70.                if (!response.startsWith ("150 " )) {
  71.                 //if (!response.startsWith("150 " )) {
  72.                   throw new IOException("SimpleFTP was not allowed to send the file: "
  73.                       + response);
  74.                 }
  75.                 BufferedOutputStream output = new BufferedOutputStream(dataSocket
  76.                     .getOutputStream());
  77.                 byte[] buffer = new byte[BUFFER_SIZE];
  78.                 int bytesRead = 0;
  79.                 counter = 0;//Initialisation des variables d'évolution d'upload
  80.                   timeElapse = 0;
  81.                
  82.                 while (uploadOk)
  83.                 {
  84.                    timed=System.currentTimeMillis();// on récupère la durée au début de la boucle
  85.                  
  86.                  bytesRead = input.read(buffer);
  87.             
  88.                    if (bytesRead < 0) // Si il n'y a plus de données dans le flux de donnée  on sort de la boucle
  89.                    break;
  90.                
  91.                    counter += bytesRead;
  92.            
  93.              
  94.                    output.write(buffer, 0, bytesRead);//upload par buffering
  95.              
  96.                  timef=System.currentTimeMillis();//  on récupère la durée à la fin de la boucle et on fait la différence pour connaître le remps écoulé
  97.            
  98.            
  99.          
  100.             taille=bytesRead;
  101.             dureeboucle=(double)((System.currentTimeMillis()-timed));
  102.            
  103.             SwingUtilities.invokeLater(new Runnable()//MIS A JOUR DE LA PROGRESS BAR DANS l'EDT
  104.          {
  105.              public void run()
  106.              {
  107.           
  108.             tableauDuree[indiceDebit]=(double)dureeboucle/1000;
  109.             dureeMoyen = (tableauDuree[0]+tableauDuree[1]+tableauDuree[2]+tableauDuree[3]+tableauDuree[4]+tableauDuree[5]+tableauDuree[6]+tableauDuree[7])/8;
  110.           
  111.             tableauDebit[indiceDebit]= (int)((double)taille/(dureeMoyen)/1024);
  112.           
  113.             indiceDebit++;
  114.             debitMoyen=(tableauDebit[0]+tableauDebit[1]+tableauDebit[2]+tableauDebit[3]+tableauDebit[4]+tableauDebit[5]+tableauDebit[6]+tableauDebit[7])/8;
  115.           
  116.             JU.setProgressValue(counter); 
  117.                JU.setSizeUploaded("Télachargé : "+ counter/1000 +"kB of "+ size /1000 +"kB" );
  118.             if(indiceDebit==8)
  119.                {  JU.setTimeRemaining("Temps restant : "+conversionmSHMS((int)((double)(size-counter)/(double)debitMoyen))+ " (à "+debitMoyen+"kB/s)" );
  120.               
  121.                 indiceDebit=0;
  122.                }
  123.              }
  124.              });     
  125.                
  126.        
  127.          timeElapse += (timef-timed);
  128.          timef=System.currentTimeMillis(); 
  129.             
  130.               SwingUtilities.invokeLater(new Runnable() //METTRE A JOUR LE TEMPS ECOULE DANS l'EDT
  131.               {
  132.                public void run()
  133.                {
  134.                       tempsecoule=conversionmSHMScS(timeElapse);
  135.                       JU.setTimeElapsed("Temps écoulé : "+ tempsecoule);
  136.                       JU.setTimeRemaining("Temps restant : "+conversionmSHMS((int)((double)(size-counter)/(double)debitMoyen))+ " (à "+debitMoyen+"kB/s)" );
  137.                        
  138.                }
  139.                });
  140.                  
  141.                 }
  142.                 output.flush();//on attend que le buffer soit vidé pour être sur d'avoir transféré toutes les données
  143.                 output.close();//On ferme les Buffered stream pour éviter d'écrire des choses par inadvertance dans les fichiers.
  144.                 input.close();
  145.                  fttp.disconnect();
  146.                 response = fttp.readLine();
  147.                
  148.                 if(uploadOk==true)
  149.               {
  150.               SwingUtilities.invokeLater(new Runnable()  //AFFICHER UNE NOTIFICATION DE FIN DE TELECHARGEMENT DANS l'EDT
  151.                 { public void run()
  152.                 {
  153.                  JU.setVisible(false);
  154.                   JOptionPane finconnection = new JOptionPane();
  155.                finconnection.showMessageDialog(null,"Fin du téléchargement effectué\nFichier : "+f.getName()+"\nTéléchargé : "+size/1000+"kB\nDurée : "+tempsecoule+"(Min:Sec:cS)", "Upload terminé", JOptionPane.INFORMATION_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi
  156.                 
  157.                 }
  158.               });
  159.               }
  160.               else
  161.               {
  162.                try {
  163.           TestApplet.fttp.DELE(filename);
  164.          } catch (IOException e) {
  165.           // TODO Auto-generated catch block
  166.           e.printStackTrace();
  167.          }
  168.              
  169.                JOptionPane finconnection = new JOptionPane();
  170.                finconnection.showMessageDialog(null,"Téléchargement annulé\n\n Le fichier a été supprimé du serveur", "Annulation", JOptionPane.INFORMATION_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi  
  171.                 
  172.                uploadOk=true;
  173.               }
  174.             }
  175.          
  176.             catch (FTPConnectionClosedException g)
  177.             {
  178.              JU.dispose();
  179.              JOptionPane finconnection = new JOptionPane();
  180.          finconnection.showMessageDialog(null,"La connexion a été fermée. Réessayez ultérieurement", "Connexion terminée", JOptionPane.ERROR_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi  
  181.              
  182.             }
  183.             catch(java.net.SocketException m)
  184.             {
  185.              JU.dispose();
  186.              JOptionPane finconnection = new JOptionPane();
  187.          finconnection.showMessageDialog(null,"La connexion a été fermée. Réessayez ultérieurement", "Connexion terminée", JOptionPane.ERROR_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi  
  188.            
  189.             }
  190.             catch(java.net.UnknownHostException m)
  191.             {
  192.              JU.dispose();
  193.              JOptionPane finconnection = new JOptionPane();
  194.          finconnection.showMessageDialog(null,"Impossible de se connecter au serveur", "Connexion impossible", JOptionPane.ERROR_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi  
  195.            
  196.             }
  197.             catch(IOException  e)
  198.             {
  199.              e.printStackTrace();
  200.             }
  201.          
  202.             finally
  203.             {
  204.            
  205.              try {
  206.               output.flush();
  207.             output.close();
  208.             input.close();
  209.           fttp.disconnect();
  210.       } catch (IOException e) {
  211.        // TODO Auto-generated catch block
  212.        e.printStackTrace();
  213.  
  214.       }
  215.  
  216.             }
  217.              
  218.        
  219.           return null;
  220.        
  221.  
  222.         }
  223.         /*
  224.          * Executed in event dispatching thread
  225.          */
  226.         @Override
  227.         public void done() {
  228.             Toolkit.getDefaultToolkit().beep();
  229.            
  230.         }
  231.     }


Reply

Marsh Posté le 15-03-2009 à 18:46:51   

Reply

Marsh Posté le 19-03-2009 à 10:03:14    

J'ai trouvé la réponse à ce problème, en fait, si cela ne fonctionnait pas sur une page web, c'est que je n'avais pas mis les archives commons-net-2.0 et substance.jar dans la liste archive="" du code pour créer une applet et surtout, je ne les avais pas signés.
 
   Donc Attention, lorsqu'on réalise une applet, il faut que toutes les archives que vous avez rajouté dans le build path avec eclipse par exemple se trouvent signés et dans la liste des archives que vous mettez dans le code archive="".
 
   Merci d'avoir pris le temps de lire mon message même si vous n'y avez pas répondu.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed