Ftp-Client Tutorial

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen

Java Ftp Client Tutorial

Mache mich mal dran ein Ftp Tutorial zu schreiben. In unserem Tutorial erstellen wir einen FTP Server. Wir verwenden für Das Tutorial die mitgelieferte Klasse aus der neusten Java Version. Für dieses Tutorial solltest du die Grundlagen von Java kennen. Auch empfehle ich eine IDE zu benutzen, die über einen Designer verfügt.

Importe

<code=java> import java.awt.List; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import sun.net.ftp.FtpClient; import sun.net.ftp.FtpDirEntry; import sun.net.ftp.FtpProtocolException; </code=java>


Das Frame

Ich habe bei mir das Frame mit einer IDE geschrieben, die einen Designer verwendet, aber erfahrene Java Programmierer sollten dies auch in wenigen Minuten mit einer DIE, die ohne Designer arbeitet hinbekommen. In dem folgenden Bild seht ihr, wie ich das Frame aufgebaut habe.

Das Frame

Wie man sieht befinden sich auf dem Frame drei Listen und ein Menüstrip mit zwei Menüs, drei Textfelder, ein Passwortfeld und ein Button. Ich habe folgende Listen - Modelle den jeweiligen Listen zugeordnet:


  • Liste1 (DefaultListModel) mod (Zeigt die Verzeichnisse an und verfügt über ein Click ActionEvent
  • Liste2 (DefaultListModel) Fmod (Zeigt die Dateien aus dem aktuellen Verzeichniss an.
  • Liste3 (DefaultListModel) Cmod (Dient als interne Console)


Die Textfelder werden wie folgt verwendet

  • TextFeld1 Hier wird der Server Angegeben
  • Textfeld2 Hier wird der Port Angegeben (Bei vielen Servern ist dies der Standard Port 21)
  • Textfeld3 Hier kommt der Benutzername rein
  • PasswordFeld1 Das Passwort.


Das Menü ist wie folgt aufgebaut:

  • File
    • Verbinden
    • Trenen
    • Daten Uploaden
    • Daten Downloaden
    • Daten Löschen
    • Verzeichniss Löschen
    • Verzeichniss Erstellen
  • Edit
    • Übergeordneter Ordner

Die Codes

Variabeln in der Klasse

<code=java> //Suchen nach public class main extends javax.swing.JFrame { //hier diese Einträge Darunter Setzen public DefaultListModel mod; public FtpClient ftp; public FtpDirEntry direlement; public DefaultListModel Fmod; public DefaultListModel Cmod; </code=java>


Listen Initialisieren

Ich habe So die Listen Initalisiert <code=java> public main() { initComponents(); // Hinzufügen mod = new DefaultListModel(); jList1.setModel(mod); Fmod = new DefaultListModel(); jList2.setModel(Fmod); Cmod = new DefaultListModel(); jList3.setModel(Cmod); } </code=java>

Das Verbinden Action Event

<code=java> // Elemente aus Modellen Löschen

       	Fmod.removeAllElements();
       	mod.removeAllElements();
       	// deklariren
       	// Deklarieren des List Models
       	mod = (DefaultListModel) jList1.getModel();
       	// holen des Inhaltes aus der Server Text Box
       	String servUrl=jTextField1.getText();
       	// holen des Inhaltes aus der Port Text Box
       	int port=Integer.parseInt(jTextField2.getText());
       	// Internet Adresse umwandln in IP
       	String ipAdr = InetAddress.getByName(servUrl).getHostAddress();
       	// Consolen Anzeige
       	Cmod.addElement("Encode Adresse " + servUrl + " in IP Adresse " + ipAdr);
       	System.out.println("Endode Addresse in IP: " + ipAdr);   	
       	// Socket Addresse Deklarieren
       	SocketAddress sAdr = new InetSocketAddress(ipAdr,port);
       	// Deklarieren des ftpClients
       	ftp =  FtpClient.create();

       	// Benutzername Festelgen
       	String userName = jTextField3.getText();

       	//Verbindung Aufbauen
       	ftp.connect(sAdr);
       	//Wen Verbindung Besteht, einlogen
       	if(ftp.isConnected()==true){
           	// Console giebt aus das wir uns erfolgreich verbunden haben
           	Cmod.addElement("Erfolgreich mit Server " + ipAdr + " Verbunden");
           	System.out.println("Erfolgreich mit Server " + ipAdr + " Verbunden");
            	// Wir lassen Uns die Begrüßungsnachricht ausgeben
           	System.out.print(ftp.getWelcomeMsg());
           	Cmod.addElement(ftp.getWelcomeMsg());
           	// Hier Loggen wir uns in den Server ein
           	ftp.login(userName, jPasswordField1.getPassword());
           	// Wenn wir Eingelogt Sind 
           	if(ftp.isLoggedIn()==true){
               	// Wir Bekommen eine nachricht vom Server das wir uns Erfolgreich Eingelogt sind
               	Cmod.addElement("User " + userName + " Access Garanted");
               	System.out.println("User: " + userName + " ist erfolgreich im Server eingelogt");
               	// Nun deklarieren wir unser Aktuelles Verzeichniss
               	String dir = ftp.getWorkingDirectory();
               	// Nun lesen wir die Verzeichnisse Aus
               	Iterator<FtpDirEntry> dirlist = ftp.listFiles(dir);
               	// Listview Model leeren
               	mod.removeAllElements();
               	// hinzufügen der neune Verzeichnisse
               	while(dirlist.hasNext()){
                  	// elemnt in die DirEntry hinzufügen
                  	direlement = dirlist.next();
                  	// Prüfen ob es ein Verzeichniss ist
                  	if(direlement.getType()==FtpDirEntry.Type.DIR){
                      	// in Model Hinzufügen
                      	mod.addElement(direlement.getName());
                  	}
                  	if(direlement.getType()==FtpDirEntry.Type.FILE){
                      	Fmod.addElement(direlement.getName());
                  	}
               	}
           	}
       	}



   	} catch (UnknownHostException ex) {
       	Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
   	} catch (FtpProtocolException ex) {
       	Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
   	} catch (IOException ex) {
       	Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
   	}

</code=java>

Das Trennen Action Event

<code=java>

       try {
           // TODO add your handling code here:
           ftp.close();
       } catch (IOException ex) {
           Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
       }

</code=java>

Das listview ClickAction Event

<code=java> // List Model Deklarieren

   	mod = (DefaultListModel) jList1.getModel();
   	// Prüfen ob der Client noch Verbunden ist 
   	if(ftp.isConnected()==true){
       	//prüfen ob wir noch eingelogt sind
       	if(ftp.isLoggedIn()==true){
           	try {
               	//Verzeichniss Wechselen
               	ftp.changeDirectory(jList1.getSelectedValue().toString());
               	// System giebt aus das das Verzeichniss gewechselt wurde
               	Cmod.addElement("Verzeichniss Gewechelt nach: " + ftp.getWorkingDirectory());
               	System.out.print("Verzeichniss Gewechselt nach :" + ftp.getWorkingDirectory());
               	// wir Listen die Files in dem Neune Verzeichniss
               	Iterator<FtpDirEntry> dirs = ftp.listFiles(ftp.getWorkingDirectory());
               	// wir Löschen die Alten List items
               	mod.removeAllElements();
               	Fmod.removeAllElements();
               	// Wir Tragen die Verzeichniss ein
               	while(dirs.hasNext()){
                   	// wir Deklarieren das Element
                   	direlement=dirs.next();
                   	// Wir Prüfen ob das Element ein Verzeichniss ist
                   	if(direlement.getType()==FtpDirEntry.Type.DIR){
                       	// wir fügen den Verzeichniss namen in die Liste ein
                       	mod.addElement(direlement.getName());
                   	}
                   	else if(direlement.getType()==FtpDirEntry.Type.FILE){
                       	Fmod.addElement(direlement.getName());
                   	}
               	}

           	} catch (FtpProtocolException ex) {
               	Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
           	} catch (IOException ex) {
               	Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
           	}
       	}
   	}

</code=java>


das Multi Download ActionEvent

<code=java> // Wir Deklarieren den FileChooser

   	JFileChooser sfd = new JFileChooser();
   	// Wir schreiben in das Datenfeld Bitte Wählen, da wir nur das Verzeichniss Benötigen
   	sfd.setSelectedFile(new File("Bitte Wählen"));
   	//Wenn Ok Gedrückt Wurde
   	if(sfd.showSaveDialog(sfd) == JFileChooser.APPROVE_OPTION){
       	// list erstellen mit Unseren Ausgewählten Daten
       	Object[] flist = jList2.getSelectedValues();
       	for(int i = 0; i < flist.length; i++){

           	try {
               	// wir geben Aus welche File wir Downloaden möchten
               	Cmod.addElement("Get file " + flist[i] + " from Curent Directory " + ftp.getWorkingDirectory());
               	System.out.println("Get file " + flist[i] + " from Curent Directory " + ftp.getWorkingDirectory());
               	// neue File Erstellen
               	File f = new File(sfd.getSelectedFile().getParent() + "/" + flist[i]);
               	// Output Stream Erstellen
               	FileOutputStream os = new FileOutputStream(f);
               	// Datei Herunterladen
               	ftp.getFile(ftp.getWorkingDirectory() + "/" +flist[i], os);
               	// Server Antwortet auf unsere Anfrage
               	Cmod.addElement("Server: " + ftp.getLastResponseString());
               	System.out.println("Server: " + ftp.getLastResponseString());
           	} catch (FileNotFoundException ex) {
               	Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
           	} catch (FtpProtocolException ex) {
               	Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
           	} catch (IOException ex) {
               	Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
           	}


       	}
       	// Ausgeben Das der Download Beendet wurde
       	Cmod.addElement("Download Vorgang Beendet");
       	System.out.println("Download Vorgang Beendet");
   	}

</code=java>


Das Multi Upload Action Event

<code=java> //Wir erstellen einen Filechooser zum Wählen der Daten

       JFileChooser ofd = new JFileChooser();
       //mehrfach auswahl Aktivieren
       ofd.setMultiSelectionEnabled(true);
       // Wenn im Filechooser auf Ok geklickt wird
       if(ofd.showOpenDialog(ofd)==JFileChooser.APPROVE_OPTION){
           // Wir Erstellen eine Filelist die unsere Gewählten files Beinhaltet
           File[] flist = ofd.getSelectedFiles();
           // Wir laden jede Einzelne File hoch
           for(int i = 0 ; i<flist.length;i++){
               try {
                   // hiier Deklarieren wir die File
                   File f = flist[i];
                   // Info für Console
                   Cmod.addElement("Put File " + f.getName() + " in to " + ftp.getWorkingDirectory() + " directory");
                   System.out.println("Put File " + f.getName() + " in to " + ftp.getWorkingDirectory() + " directory");
                   // Wir erstellen einen Fileinputstream zum Auslesen der Datei
                   FileInputStream is = new FileInputStream(f);
                   // Nun wird die Datei ochgeladen
                   ftp.putFile(ftp.getWorkingDirectory() + "/" + f.getName(), is);
                   // Console giebt server Nachricht aus
                   Cmod.addElement("Server: " +ftp.getLastResponseString());
                   System.out.println("Server: " +ftp.getLastResponseString());
               } catch (FileNotFoundException ex) {
                   Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
               } catch (FtpProtocolException ex) {
                   Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
               } catch (IOException ex) {
                   Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
               }

           }
           // Console giebt aus das Übertragung beendet Wurde
           Cmod.addElement("Übertragung der Files " + flist.toString() + " Beendet");
           System.out.println("Übertragung der Files " + flist.toString() + " Beendet");
       }

</code=java>


Das Übergerordneter Ordner Event

<code=java> // Elemente Entfernen

           mod.removeAllElements();
           Fmod.removeAllElements();

           // FtpDirEntry Deklarieren
           FtpDirEntry dir;         
           // Verzeichniss Wechseln
           ftp.changeToParentDirectory();       
           // Neues Verzeichniss in Console Ausgeben
           Cmod.addElement("Aktuelles Verzeichniss " + ftp.getWorkingDirectory());

           // Verzeichnisse in eine FtpDirEntry List hinzufügen
           Iterator<FtpDirEntry> dirlist = ftp.listFiles(ftp.getWorkingDirectory());

           // Jedes Verzeichniss Ausgeben
           while(dirlist.hasNext()){
               // dir elemnt Deklarieren
               dir=dirlist.next();

               // ist dir ein Ordner ?
               if(dir.getType()==FtpDirEntry.Type.DIR){
                   // wenn ja dan in List 1
                   mod.addElement(dir.getName());
               }
               // Ist dir eine Datei ?
               if(dir.getType()==FtpDirEntry.Type.FILE){
                   // wenn ja dan in List 2
                   Fmod.addElement(dir.getName());
               }
           }


       } catch (FtpProtocolException ex) {
           Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
       } catch (IOException ex) {
           Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
       }

</code=java>


Das Datei Löschen Event

<code=java> try {

           // TODO add your handling code here:

           // Wir Schreiben in die Console das Wir die Datei Löschen
           Cmod.addElement("Delete File " + ftp.getWorkingDirectory() + "/" + jList2.getSelectedValue().toString());
           System.out.println("Delete File " + ftp.getWorkingDirectory() + "/" + jList2.getSelectedValue().toString());

           // Wir Löschen die Datei
           ftp.deleteFile(ftp.getWorkingDirectory() + "/" + jList2.getSelectedValue().toString());

           // Wir Geben die Server Antwort aus
           Cmod.addElement("Server: "+ ftp.getLastResponseString());
           System.out.println("Server: "+ ftp.getLastResponseString());

       } catch (FtpProtocolException ex) {
           Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
       } catch (IOException ex) {
           Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
       }

</code=java>

Das Verzeichniss Löschen Event

<code=java> try {

           // TODO add your handling code here:
               // Wir Schreiben in die Console das Wir das Verzeichniss Löschen
               Cmod.addElement("Delete Directory " + ftp.getWorkingDirectory());
               System.out.println("Delete Directory " + ftp.getWorkingDirectory());

               // Wir Löschen Das Verzeichniss
               ftp.removeDirectory(ftp.getWorkingDirectory());

               // Wir Geben die Server Antwort aus
               Cmod.addElement("Server: "+ ftp.getLastResponseString());
               System.out.println("Server: "+ ftp.getLastResponseString());



       } catch (FtpProtocolException ex) {
           Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
       } catch (IOException ex) {
           Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
       }

</code=java>


Das Verzeichniss Erstellen Event

<code=java> // Deklarieren der Elemente

       JDialog dia = new JDialog();
       dia.setSize(375, 110);
       dia.setLayout(null);
       dia.setTitle("Neues Verzeichniss anlegen");
       JButton b = new JButton("Erstellen");
       final JTextField textfield = new JTextField();

       // Platzieren der Elemente
       textfield.setLocation(25, 25);
       textfield.setSize(200, 20);
       b.setLocation(235, 25);
       b.setSize(100,20);


       // Füge Controls Hinzu
       dia.add(textfield);
       dia.add(b);
       dia.setVisible(true);

       // Action Listner auf Button Legen
       b.addActionListener(new ActionListener(){
       public void actionPerformed(ActionEvent e){
           try {

               // Console Giebt aus das wir ein Verzeichniss Erstellen
               Cmod.addElement("Create Dir " + ftp.getWorkingDirectory() + "/" + textfield.getText());
               System.out.println("Create Dir " + ftp.getWorkingDirectory() + "/" + textfield.getText());

               // Wir Erstellen das Verzeichniss
               ftp.makeDirectory(ftp.getWorkingDirectory() + "/" + textfield.getText());

               // Wir Geben die System Nachricht aus 
               Cmod.addElement("Server: "+ ftp.getLastResponseString());
               System.out.println("Server: "+ ftp.getLastResponseString());


           } catch (FtpProtocolException ex) {
               Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
           } catch (IOException ex) {
               Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
           }

       }
       });

</code=java>


Das war der Letzte Teil des Toturials. Natürlich Könnte man noch X-Funktionen einfügen aber den Spaß überlasse ich euch. Auf Anfrage sende ich auch gerne Die Sourcecodes Zu, einfach im Forum eine PN an Andy16823.


Quellen - Mitwirkende

  • | Martin - aus Anderem Forum - hat geholfen

Änderungen & Hystorie

Ich würde mich freuen, wenn man die Bearbeitung kennzeichnet - also wie ich.