Ftp-Client Tutorial: Unterschied zwischen den Versionen
(→Java Ftp Client Tutorial) |
K (→Listen Initialisieren) |
||
(28 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
= Java Ftp Client Tutorial = | = 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 == | |
− | + | <syntaxhighlight lang="java"> | |
− | |||
− | |||
− | < | ||
import java.awt.List; | import java.awt.List; | ||
import java.awt.event.ActionEvent; | import java.awt.event.ActionEvent; | ||
Zeile 36: | Zeile 34: | ||
import sun.net.ftp.FtpDirEntry; | import sun.net.ftp.FtpDirEntry; | ||
import sun.net.ftp.FtpProtocolException; | import sun.net.ftp.FtpProtocolException; | ||
− | </ | + | </syntaxhighlight> |
== Das Frame == | == Das Frame == | ||
− | Ich habe bei mir das Frame mit einer IDE | + | 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 IDE, die ohne Designer arbeitet hinbekommen. |
− | auch in | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | In dem folgenden Bild zeige ich, wie ich das Frame aufgebaut habe. | |
+ | [[Datei:Bild22.PNG|mini|hochkant=1.8|Das Frame]] | ||
+ | Wie man sieht, befinden sich auf dem {{JAPI|JFrame}} drei Listen und eine {{JAPI|MenuBar}} mit zwei Menüs, drei {{JAPI|JTextField}}s, einem {{JAPI|JPasswortField}} und einem [[JButton]]. Ich habe folgende {{JAPI|ListModel}}s den jeweiligen Listen zugeordnet: | ||
− | |||
− | |||
− | |||
+ | * Liste1 ({{JAPI|DefaultListModel}}) mod (zeigt die Verzeichnisse an und verfügt über ein {{JAPI|ActionEvent}}) | ||
+ | * Liste2 (DefaultListModel) Fmod (zeigt die Dateien aus dem aktuellen Verzeichnis 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 FTP-Servern ist dies standardmäßig Port 21) | ||
+ | * Textfeld3 - hier wird der Benutzername eingegeben | ||
+ | * PasswordFeld1 - ein Eingabefeld für das Passwort. | ||
− | |||
+ | '''Das Menü ist wie folgt aufgebaut:''' | ||
* File | * File | ||
** Verbinden | ** Verbinden | ||
− | ** | + | ** Trennen |
− | ** Daten | + | ** Daten uploaden |
− | ** Daten | + | ** Daten downloaden |
** Daten Löschen | ** Daten Löschen | ||
− | ** | + | ** Verzeichnis löschen |
− | ** | + | ** Verzeichnis erstellen |
* Edit | * Edit | ||
Zeile 87: | Zeile 80: | ||
=== Variabeln in der Klasse === | === Variabeln in der Klasse === | ||
− | < | + | <syntaxhighlight lang="java"> |
//Suchen nach | //Suchen nach | ||
− | public class | + | public class Main extends javax.swing.JFrame { |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | private DefaultListModel mod; | ||
+ | private FtpClient ftp; | ||
+ | private FtpDirEntry direlement; | ||
+ | private DefaultListModel Fmod; | ||
+ | private DefaultListModel Cmod; | ||
+ | </syntaxhighlight> | ||
=== Listen Initialisieren === | === Listen Initialisieren === | ||
− | + | Im Konstruktor habe ich die Listen initialisiert. | |
− | < | + | <syntaxhighlight lang="java"> |
− | public | + | public Main() { |
− | initComponents(); | + | initComponents(); |
− | + | ||
− | mod = new DefaultListModel(); | + | mod = new DefaultListModel(); |
− | jList1.setModel(mod); | + | jList1.setModel(mod); |
− | Fmod = new DefaultListModel(); | + | Fmod = new DefaultListModel(); |
− | jList2.setModel(Fmod); | + | jList2.setModel(Fmod); |
− | Cmod = new DefaultListModel(); | + | Cmod = new DefaultListModel(); |
− | jList3.setModel(Cmod); | + | jList3.setModel(Cmod); |
} | } | ||
− | </ | + | </syntaxhighlight> |
=== Das Verbinden Action Event === | === Das Verbinden Action Event === | ||
− | < | + | <syntaxhighlight lang="java"> |
// Elemente aus Modellen Löschen | // Elemente aus Modellen Löschen | ||
Fmod.removeAllElements(); | Fmod.removeAllElements(); | ||
Zeile 187: | Zeile 179: | ||
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); | Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
=== Das Trennen Action Event === | === Das Trennen Action Event === | ||
− | < | + | <syntaxhighlight lang="java"> |
try { | try { | ||
// TODO add your handling code here: | // TODO add your handling code here: | ||
Zeile 198: | Zeile 190: | ||
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); | Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
=== Das listview ClickAction Event === | === Das listview ClickAction Event === | ||
− | < | + | <syntaxhighlight lang="java"> |
− | // | + | // ListModel deklarieren |
mod = (DefaultListModel) jList1.getModel(); | mod = (DefaultListModel) jList1.getModel(); | ||
− | // Prüfen ob der Client noch | + | // Prüfen, ob der Client noch verbunden ist |
− | if(ftp.isConnected() | + | if(ftp.isConnected()){ |
− | //prüfen ob wir noch | + | //prüfen ob wir noch eingeloggt sind |
− | if(ftp.isLoggedIn() | + | if(ftp.isLoggedIn()){ |
try { | try { | ||
− | //Verzeichniss | + | //Verzeichniss wechseln |
ftp.changeDirectory(jList1.getSelectedValue().toString()); | ftp.changeDirectory(jList1.getSelectedValue().toString()); | ||
− | // System | + | // System gibt, aus dass das Verzeichniss gewechselt wurde |
− | Cmod.addElement(" | + | Cmod.addElement("Verzeichnis gewechelt nach: " + ftp.getWorkingDirectory()); |
− | System.out.print(" | + | System.out.print("Verzeichnis gewechselt nach :" + ftp.getWorkingDirectory()); |
− | // wir | + | // wir listen die Files aus dem neuen Verzeichnis |
Iterator<FtpDirEntry> dirs = ftp.listFiles(ftp.getWorkingDirectory()); | Iterator<FtpDirEntry> dirs = ftp.listFiles(ftp.getWorkingDirectory()); | ||
− | // wir | + | // wir löschen die alten list items |
mod.removeAllElements(); | mod.removeAllElements(); | ||
Fmod.removeAllElements(); | Fmod.removeAllElements(); | ||
− | // Wir | + | // Wir tragen die Verzeichnisse ein |
while(dirs.hasNext()){ | while(dirs.hasNext()){ | ||
− | // wir | + | // wir deklarieren das Element |
direlement=dirs.next(); | direlement=dirs.next(); | ||
− | // Wir | + | // Wir prüfen, ob das Element ein Verzeichnis ist |
if(direlement.getType()==FtpDirEntry.Type.DIR){ | if(direlement.getType()==FtpDirEntry.Type.DIR){ | ||
// wir fügen den Verzeichniss namen in die Liste ein | // wir fügen den Verzeichniss namen in die Liste ein | ||
Zeile 231: | Zeile 223: | ||
Fmod.addElement(direlement.getName()); | Fmod.addElement(direlement.getName()); | ||
} | } | ||
− | + | } | |
} catch (FtpProtocolException ex) { | } catch (FtpProtocolException ex) { | ||
Zeile 240: | Zeile 232: | ||
} | } | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
− | |||
=== das Multi Download ActionEvent === | === das Multi Download ActionEvent === | ||
− | < | + | <syntaxhighlight lang="java"> |
− | // Wir | + | // Wir deklarieren den JFileChooser |
JFileChooser sfd = new JFileChooser(); | JFileChooser sfd = new JFileChooser(); | ||
− | // Wir schreiben in das Datenfeld Bitte Wählen, da wir nur das | + | // Wir schreiben in das Datenfeld >>Bitte Wählen<<, da wir nur das Verzeichnis benötigen |
sfd.setSelectedFile(new File("Bitte Wählen")); | sfd.setSelectedFile(new File("Bitte Wählen")); | ||
− | //Wenn Ok | + | //Wenn Ok gedrückt Wurde |
if(sfd.showSaveDialog(sfd) == JFileChooser.APPROVE_OPTION){ | if(sfd.showSaveDialog(sfd) == JFileChooser.APPROVE_OPTION){ | ||
− | // list erstellen mit | + | // list erstellen mit unseren ausgewählten Daten |
Object[] flist = jList2.getSelectedValues(); | Object[] flist = jList2.getSelectedValues(); | ||
for(int i = 0; i < flist.length; i++){ | for(int i = 0; i < flist.length; i++){ | ||
try { | try { | ||
− | // wir geben | + | // wir geben aus, welche Files wir downloaden möchten |
Cmod.addElement("Get file " + flist[i] + " from Curent Directory " + ftp.getWorkingDirectory()); | Cmod.addElement("Get file " + flist[i] + " from Curent Directory " + ftp.getWorkingDirectory()); | ||
System.out.println("Get file " + flist[i] + " from Curent Directory " + ftp.getWorkingDirectory()); | System.out.println("Get file " + flist[i] + " from Curent Directory " + ftp.getWorkingDirectory()); | ||
− | // neue | + | // neue Files erstellen |
File f = new File(sfd.getSelectedFile().getParent() + "/" + flist[i]); | File f = new File(sfd.getSelectedFile().getParent() + "/" + flist[i]); | ||
− | // | + | // OutputStream erstellen |
FileOutputStream os = new FileOutputStream(f); | FileOutputStream os = new FileOutputStream(f); | ||
− | // Datei | + | // Datei herunterladen |
ftp.getFile(ftp.getWorkingDirectory() + "/" +flist[i], os); | ftp.getFile(ftp.getWorkingDirectory() + "/" +flist[i], os); | ||
− | // Server | + | // Server antwortet auf unsere Anfrage |
Cmod.addElement("Server: " + ftp.getLastResponseString()); | Cmod.addElement("Server: " + ftp.getLastResponseString()); | ||
System.out.println("Server: " + ftp.getLastResponseString()); | System.out.println("Server: " + ftp.getLastResponseString()); | ||
Zeile 279: | Zeile 270: | ||
} | } | ||
− | // Ausgeben | + | // Ausgeben, dass der Download abgeschlossen wurde |
− | Cmod.addElement("Download Vorgang | + | Cmod.addElement("Download Vorgang abgeschlossen"); |
− | System.out.println("Download Vorgang | + | System.out.println("Download Vorgang abgeschlossen"); |
} | } | ||
− | </ | + | </syntaxhighlight> |
− | |||
=== Das Multi Upload Action Event === | === Das Multi Upload Action Event === | ||
− | < | + | <syntaxhighlight lang="java"> |
− | //Wir erstellen einen | + | //Wir erstellen einen JFilechooser zum Wählen der Daten |
JFileChooser ofd = new JFileChooser(); | JFileChooser ofd = new JFileChooser(); | ||
− | // | + | //Mehrfachauswahl aktivieren |
ofd.setMultiSelectionEnabled(true); | ofd.setMultiSelectionEnabled(true); | ||
− | // Wenn im | + | // Wenn im JFileChooser auf Ok geklickt wird |
if(ofd.showOpenDialog(ofd)==JFileChooser.APPROVE_OPTION){ | if(ofd.showOpenDialog(ofd)==JFileChooser.APPROVE_OPTION){ | ||
− | // Wir | + | // Wir erstellen eine Filelist, die unsere gewählten Files beinhaltet |
File[] flist = ofd.getSelectedFiles(); | File[] flist = ofd.getSelectedFiles(); | ||
− | // Wir laden | + | // Wir laden jedes einzelne File hoch |
for(int i = 0 ; i<flist.length;i++){ | for(int i = 0 ; i<flist.length;i++){ | ||
try { | try { | ||
− | // | + | // hier deklarieren wir die Files |
File f = flist[i]; | File f = flist[i]; | ||
// Info für Console | // Info für Console | ||
Cmod.addElement("Put File " + f.getName() + " in to " + ftp.getWorkingDirectory() + " directory"); | Cmod.addElement("Put File " + f.getName() + " in to " + ftp.getWorkingDirectory() + " directory"); | ||
System.out.println("Put File " + f.getName() + " in to " + ftp.getWorkingDirectory() + " directory"); | System.out.println("Put File " + f.getName() + " in to " + ftp.getWorkingDirectory() + " directory"); | ||
− | // Wir erstellen einen | + | // Wir erstellen einen FileInputStream zum Auslesen der Datei |
FileInputStream is = new FileInputStream(f); | FileInputStream is = new FileInputStream(f); | ||
− | // Nun wird die Datei | + | // Nun wird die Datei hochgeladen |
ftp.putFile(ftp.getWorkingDirectory() + "/" + f.getName(), is); | ftp.putFile(ftp.getWorkingDirectory() + "/" + f.getName(), is); | ||
− | // Console | + | // Console gibt Server-Nachricht aus |
Cmod.addElement("Server: " +ftp.getLastResponseString()); | Cmod.addElement("Server: " +ftp.getLastResponseString()); | ||
System.out.println("Server: " +ftp.getLastResponseString()); | System.out.println("Server: " +ftp.getLastResponseString()); | ||
Zeile 321: | Zeile 311: | ||
} | } | ||
− | // Console | + | // Console gibt aus, dass Übertragung beendet wurde |
− | Cmod.addElement("Übertragung der Files " + flist.toString() + " | + | Cmod.addElement("Übertragung der Files " + flist.toString() + " abgeschlossen"); |
− | System.out.println("Übertragung der Files " + flist.toString() + " | + | System.out.println("Übertragung der Files " + flist.toString() + " abgeschlossen"); |
} | } | ||
− | </ | + | </syntaxhighlight> |
− | |||
=== Das Übergerordneter Ordner Event === | === Das Übergerordneter Ordner Event === | ||
− | < | + | <syntaxhighlight lang="java"> |
− | // Elemente | + | // Elemente entfernen |
mod.removeAllElements(); | mod.removeAllElements(); | ||
Fmod.removeAllElements(); | Fmod.removeAllElements(); | ||
− | // FtpDirEntry | + | // FtpDirEntry deklarieren |
FtpDirEntry dir; | FtpDirEntry dir; | ||
− | // | + | // Verzeichnis wechseln |
ftp.changeToParentDirectory(); | ftp.changeToParentDirectory(); | ||
− | // Neues | + | // Neues Verzeichnis in Console ausgeben |
− | Cmod.addElement("Aktuelles | + | Cmod.addElement("Aktuelles Verzeichnis " + ftp.getWorkingDirectory()); |
− | // Verzeichnisse | + | // Verzeichnisse einer FtpDirEntry-List hinzufügen |
Iterator<FtpDirEntry> dirlist = ftp.listFiles(ftp.getWorkingDirectory()); | Iterator<FtpDirEntry> dirlist = ftp.listFiles(ftp.getWorkingDirectory()); | ||
− | // Jedes | + | // Jedes Verzeichnis ausgeben |
while(dirlist.hasNext()){ | while(dirlist.hasNext()){ | ||
− | // dir | + | // dir Element deklarieren |
dir=dirlist.next(); | dir=dirlist.next(); | ||
// ist dir ein Ordner ? | // ist dir ein Ordner ? | ||
− | if(dir.getType()==FtpDirEntry.Type.DIR){ | + | if(dir.getType() == FtpDirEntry.Type.DIR){ |
− | // wenn ja | + | // wenn ja, dann in List 1 |
mod.addElement(dir.getName()); | mod.addElement(dir.getName()); | ||
} | } | ||
− | // | + | // ist dir eine Datei ? |
− | if(dir.getType()==FtpDirEntry.Type.FILE){ | + | else if(dir.getType() == FtpDirEntry.Type.FILE){ |
− | // wenn ja | + | // wenn ja, dann in List 2 |
Fmod.addElement(dir.getName()); | Fmod.addElement(dir.getName()); | ||
} | } | ||
Zeile 367: | Zeile 356: | ||
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); | Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
− | |||
=== Das Datei Löschen Event === | === Das Datei Löschen Event === | ||
− | < | + | <syntaxhighlight lang="java"> |
try { | try { | ||
// TODO add your handling code here: | // TODO add your handling code here: | ||
− | // Wir | + | // Wir schreiben in die Console, dass wir die Datei löschen |
Cmod.addElement("Delete File " + ftp.getWorkingDirectory() + "/" + jList2.getSelectedValue().toString()); | Cmod.addElement("Delete File " + ftp.getWorkingDirectory() + "/" + jList2.getSelectedValue().toString()); | ||
System.out.println("Delete File " + ftp.getWorkingDirectory() + "/" + jList2.getSelectedValue().toString()); | System.out.println("Delete File " + ftp.getWorkingDirectory() + "/" + jList2.getSelectedValue().toString()); | ||
− | // Wir | + | // Wir löschen die Datei |
ftp.deleteFile(ftp.getWorkingDirectory() + "/" + jList2.getSelectedValue().toString()); | ftp.deleteFile(ftp.getWorkingDirectory() + "/" + jList2.getSelectedValue().toString()); | ||
− | // Wir | + | // Wir geben die Server-Antwort aus |
Cmod.addElement("Server: "+ ftp.getLastResponseString()); | Cmod.addElement("Server: "+ ftp.getLastResponseString()); | ||
System.out.println("Server: "+ ftp.getLastResponseString()); | System.out.println("Server: "+ ftp.getLastResponseString()); | ||
Zeile 392: | Zeile 380: | ||
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); | Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
− | === Das | + | === Das Event zum Verzeichnis Löschen === |
− | < | + | <syntaxhighlight lang="java"> |
try { | try { | ||
// TODO add your handling code here: | // TODO add your handling code here: | ||
− | // Wir | + | // Wir schreiben in die Console, dass wir das Verzeichnis löschen |
Cmod.addElement("Delete Directory " + ftp.getWorkingDirectory()); | Cmod.addElement("Delete Directory " + ftp.getWorkingDirectory()); | ||
System.out.println("Delete Directory " + ftp.getWorkingDirectory()); | System.out.println("Delete Directory " + ftp.getWorkingDirectory()); | ||
− | // Wir | + | // Wir löschen das Verzeichnis |
ftp.removeDirectory(ftp.getWorkingDirectory()); | ftp.removeDirectory(ftp.getWorkingDirectory()); | ||
Zeile 417: | Zeile 405: | ||
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); | Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
− | |||
=== Das Verzeichniss Erstellen Event === | === Das Verzeichniss Erstellen Event === | ||
− | < | + | <syntaxhighlight lang="java"> |
// Deklarieren der Elemente | // Deklarieren der Elemente | ||
JDialog dia = new JDialog(); | JDialog dia = new JDialog(); | ||
dia.setSize(375, 110); | dia.setSize(375, 110); | ||
dia.setLayout(null); | dia.setLayout(null); | ||
− | dia.setTitle("Neues | + | dia.setTitle("Neues Verzeichnis anlegen"); |
JButton b = new JButton("Erstellen"); | JButton b = new JButton("Erstellen"); | ||
final JTextField textfield = new JTextField(); | final JTextField textfield = new JTextField(); | ||
Zeile 437: | Zeile 424: | ||
− | // Füge Controls | + | // Füge Controls hinzu |
dia.add(textfield); | dia.add(textfield); | ||
dia.add(b); | dia.add(b); | ||
dia.setVisible(true); | dia.setVisible(true); | ||
− | // | + | // ActionListener am Button anmelden |
b.addActionListener(new ActionListener(){ | b.addActionListener(new ActionListener(){ | ||
public void actionPerformed(ActionEvent e){ | public void actionPerformed(ActionEvent e){ | ||
try { | try { | ||
− | // Console | + | // Console gibt aus, dass wir ein Verzeichnis erstellen |
Cmod.addElement("Create Dir " + ftp.getWorkingDirectory() + "/" + textfield.getText()); | Cmod.addElement("Create Dir " + ftp.getWorkingDirectory() + "/" + textfield.getText()); | ||
System.out.println("Create Dir " + ftp.getWorkingDirectory() + "/" + textfield.getText()); | System.out.println("Create Dir " + ftp.getWorkingDirectory() + "/" + textfield.getText()); | ||
− | // Wir | + | // Wir erstellen das Verzeichnis |
ftp.makeDirectory(ftp.getWorkingDirectory() + "/" + textfield.getText()); | ftp.makeDirectory(ftp.getWorkingDirectory() + "/" + textfield.getText()); | ||
− | // Wir | + | // Wir geben die Systemnachricht aus |
Cmod.addElement("Server: "+ ftp.getLastResponseString()); | Cmod.addElement("Server: "+ ftp.getLastResponseString()); | ||
System.out.println("Server: "+ ftp.getLastResponseString()); | System.out.println("Server: "+ ftp.getLastResponseString()); | ||
Zeile 467: | Zeile 454: | ||
} | } | ||
}); | }); | ||
− | </ | + | </syntaxhighlight> |
+ | |||
+ | |||
+ | Natürlich könnte man noch X-Funktionen einfügen, aber den Spaß überlasse ich jetzt euch. =) | ||
+ | |||
+ | == Quellen - Mitwirkende == | ||
+ | |||
+ | * Martin - aus einem anderem Forum (das leider nicht mehr existiert) | ||
+ | |||
+ | == Änderungen & Hystorie == | ||
+ | Ich würde mich freuen, wenn man die Bearbeitung kennzeichnet - also wie ich. | ||
+ | * 22.08.2013 - Info von [[Benutzer:L-ectron-X|L-ectron-X]]: Dafür gibt es [http://wiki.byte-welt.net/mediawiki/index.php?title=Ftp-Client_Tutorial&action=history Versionen/Autoren] | ||
+ | * 17.08.2013 - Bild hinzugefügt - [[Benutzer:Andy16823|Andy16823]] | ||
− | + | [[Kategorie:Tutorials (Java)]] |
Aktuelle Version vom 4. Mai 2018, 08:45 Uhr
Inhaltsverzeichnis
- 1 Java Ftp Client Tutorial
- 1.1 Importe
- 1.2 Das Frame
- 1.3 Die Codes
- 1.3.1 Variabeln in der Klasse
- 1.3.2 Listen Initialisieren
- 1.3.3 Das Verbinden Action Event
- 1.3.4 Das Trennen Action Event
- 1.3.5 Das listview ClickAction Event
- 1.3.6 das Multi Download ActionEvent
- 1.3.7 Das Multi Upload Action Event
- 1.3.8 Das Übergerordneter Ordner Event
- 1.3.9 Das Datei Löschen Event
- 1.3.10 Das Event zum Verzeichnis Löschen
- 1.3.11 Das Verzeichniss Erstellen Event
- 1.4 Quellen - Mitwirkende
- 1.5 Änderungen & Hystorie
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
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;
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 IDE, die ohne Designer arbeitet hinbekommen.
In dem folgenden Bild zeige ich, wie ich das Frame aufgebaut habe.
Wie man sieht, befinden sich auf dem JFrame
drei Listen und eine MenuBar
mit zwei Menüs, drei JTextField
s, einem JPasswortField
und einem JButton. Ich habe folgende ListModel
s den jeweiligen Listen zugeordnet:
- Liste1 (
DefaultListModel
) mod (zeigt die Verzeichnisse an und verfügt über einActionEvent
) - Liste2 (DefaultListModel) Fmod (zeigt die Dateien aus dem aktuellen Verzeichnis 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 FTP-Servern ist dies standardmäßig Port 21)
- Textfeld3 - hier wird der Benutzername eingegeben
- PasswordFeld1 - ein Eingabefeld für das Passwort.
Das Menü ist wie folgt aufgebaut:
- File
- Verbinden
- Trennen
- Daten uploaden
- Daten downloaden
- Daten Löschen
- Verzeichnis löschen
- Verzeichnis erstellen
- Edit
- Übergeordneter Ordner
Die Codes
Variabeln in der Klasse
//Suchen nach
public class Main extends javax.swing.JFrame {
private DefaultListModel mod;
private FtpClient ftp;
private FtpDirEntry direlement;
private DefaultListModel Fmod;
private DefaultListModel Cmod;
Listen Initialisieren
Im Konstruktor habe ich die Listen initialisiert.
public Main() {
initComponents();
mod = new DefaultListModel();
jList1.setModel(mod);
Fmod = new DefaultListModel();
jList2.setModel(Fmod);
Cmod = new DefaultListModel();
jList3.setModel(Cmod);
}
Das Verbinden Action Event
// 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);
}
Das Trennen Action Event
try {
// TODO add your handling code here:
ftp.close();
} catch (IOException ex) {
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
}
Das listview ClickAction Event
// ListModel deklarieren
mod = (DefaultListModel) jList1.getModel();
// Prüfen, ob der Client noch verbunden ist
if(ftp.isConnected()){
//prüfen ob wir noch eingeloggt sind
if(ftp.isLoggedIn()){
try {
//Verzeichniss wechseln
ftp.changeDirectory(jList1.getSelectedValue().toString());
// System gibt, aus dass das Verzeichniss gewechselt wurde
Cmod.addElement("Verzeichnis gewechelt nach: " + ftp.getWorkingDirectory());
System.out.print("Verzeichnis gewechselt nach :" + ftp.getWorkingDirectory());
// wir listen die Files aus dem neuen Verzeichnis
Iterator<FtpDirEntry> dirs = ftp.listFiles(ftp.getWorkingDirectory());
// wir löschen die alten list items
mod.removeAllElements();
Fmod.removeAllElements();
// Wir tragen die Verzeichnisse ein
while(dirs.hasNext()){
// wir deklarieren das Element
direlement=dirs.next();
// Wir prüfen, ob das Element ein Verzeichnis 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);
}
}
}
das Multi Download ActionEvent
// Wir deklarieren den JFileChooser
JFileChooser sfd = new JFileChooser();
// Wir schreiben in das Datenfeld >>Bitte Wählen<<, da wir nur das Verzeichnis 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 Files 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 Files erstellen
File f = new File(sfd.getSelectedFile().getParent() + "/" + flist[i]);
// OutputStream 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, dass der Download abgeschlossen wurde
Cmod.addElement("Download Vorgang abgeschlossen");
System.out.println("Download Vorgang abgeschlossen");
}
Das Multi Upload Action Event
//Wir erstellen einen JFilechooser zum Wählen der Daten
JFileChooser ofd = new JFileChooser();
//Mehrfachauswahl aktivieren
ofd.setMultiSelectionEnabled(true);
// Wenn im JFileChooser 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 jedes einzelne File hoch
for(int i = 0 ; i<flist.length;i++){
try {
// hier deklarieren wir die Files
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 hochgeladen
ftp.putFile(ftp.getWorkingDirectory() + "/" + f.getName(), is);
// Console gibt 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 gibt aus, dass Übertragung beendet wurde
Cmod.addElement("Übertragung der Files " + flist.toString() + " abgeschlossen");
System.out.println("Übertragung der Files " + flist.toString() + " abgeschlossen");
}
Das Übergerordneter Ordner Event
// Elemente entfernen
mod.removeAllElements();
Fmod.removeAllElements();
// FtpDirEntry deklarieren
FtpDirEntry dir;
// Verzeichnis wechseln
ftp.changeToParentDirectory();
// Neues Verzeichnis in Console ausgeben
Cmod.addElement("Aktuelles Verzeichnis " + ftp.getWorkingDirectory());
// Verzeichnisse einer FtpDirEntry-List hinzufügen
Iterator<FtpDirEntry> dirlist = ftp.listFiles(ftp.getWorkingDirectory());
// Jedes Verzeichnis ausgeben
while(dirlist.hasNext()){
// dir Element deklarieren
dir=dirlist.next();
// ist dir ein Ordner ?
if(dir.getType() == FtpDirEntry.Type.DIR){
// wenn ja, dann in List 1
mod.addElement(dir.getName());
}
// ist dir eine Datei ?
else if(dir.getType() == FtpDirEntry.Type.FILE){
// wenn ja, dann 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);
}
Das Datei Löschen Event
try {
// TODO add your handling code here:
// Wir schreiben in die Console, dass 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);
}
Das Event zum Verzeichnis Löschen
try {
// TODO add your handling code here:
// Wir schreiben in die Console, dass wir das Verzeichnis löschen
Cmod.addElement("Delete Directory " + ftp.getWorkingDirectory());
System.out.println("Delete Directory " + ftp.getWorkingDirectory());
// Wir löschen das Verzeichnis
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);
}
Das Verzeichniss Erstellen Event
// Deklarieren der Elemente
JDialog dia = new JDialog();
dia.setSize(375, 110);
dia.setLayout(null);
dia.setTitle("Neues Verzeichnis 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);
// ActionListener am Button anmelden
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try {
// Console gibt aus, dass wir ein Verzeichnis erstellen
Cmod.addElement("Create Dir " + ftp.getWorkingDirectory() + "/" + textfield.getText());
System.out.println("Create Dir " + ftp.getWorkingDirectory() + "/" + textfield.getText());
// Wir erstellen das Verzeichnis
ftp.makeDirectory(ftp.getWorkingDirectory() + "/" + textfield.getText());
// Wir geben die Systemnachricht 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);
}
}
});
Natürlich könnte man noch X-Funktionen einfügen, aber den Spaß überlasse ich jetzt euch. =)
Quellen - Mitwirkende
- Martin - aus einem anderem Forum (das leider nicht mehr existiert)
Änderungen & Hystorie
Ich würde mich freuen, wenn man die Bearbeitung kennzeichnet - also wie ich.
- 22.08.2013 - Info von L-ectron-X: Dafür gibt es Versionen/Autoren
- 17.08.2013 - Bild hinzugefügt - Andy16823