In diesem Artikel wird vorhanden, wie vorhandene verfügbare Bibliotheken in Java zum Schreiben von FTP -Clientcode verwendet und in Applet -Steuerelemente entwickelt werden, um Stapel zu erstellen, große Dateien basierend auf dem Web zu erstellen. Basierend auf einer Reihe von FTP-Kundenbibliotheken enthält der Artikel detaillierte Erklärungen und Code-Implementierungen in einer der häufigsten und leistungsstärkeren J-FFTP-Bibliothek, z. B. Fortschrittsbalken, Breakpoint-Fortsetzung, Zuordnung interner und externer Netzwerke und Callback-JavaScript-Funktionen in Applet. Es ist zu hoffen, dass dieser Artikel eine Rolle bei der Anziehung der Jade spielen wird.
1. Einführung
Während der Implementierung eines Projekts wurde ein webbasiertes Datei-Upload- und Download-Anforderungen entstanden. Benutzer in der Provinz (oder landesweit) müssen einige Dateien in einem bestimmten Zentrum auf den Dateiserver hochladen. Diese Dokumente werden für einige groß angelegte Ingenieurbaus verwendet, bei denen Bauprojekte im Wert von zehn Millionen oder sogar Hunderten Millionen von Yuan beteiligt sind. Dateien haben drei unterschiedliche Eigenschaften: Eine ist, dass die Datei groß ist, was 50 m erreichen kann; Die zweite ist, dass die Anzahl der Dateien groß ist, was möglicherweise etwa 15 beträgt. Der dritte ist, dass digitale Signaturen und Datenverschlüsselung in Bezug auf die Datensicherheit erforderlich sind.
Betrachten Sie zunächst die HTTP-basierte Übertragungsmethode. Im Vergleich stellte ich jedoch schnell fest, dass die oben genannten Bedürfnisse erfüllt wurden:
1: Das Hochladen mithilfe des HTTP -Protokolls scheint besser für die Komfort von Webprogrammierungen geeignet zu sein. Das Hochladen von Dateien weniger als 1 m ist etwas schneller als das Hochladen von Dateien mithilfe des FTP -Protokolls. Es kann jedoch nichts über die Übertragung von Stapel und große Dateien zu tun haben. Natürlich hat es auch seine Vorteile, beispielsweise im Gegensatz zu FTP, es ist erforderlich, einen FTP -Dienst auf der Serverseite zu starten.
2: Das Hochladen von Dateien mit Dateien, die über 1 m über das FTP -Protokoll über 1 m sind, ist schneller als HTTP. Je größer die Datei ist, die Upload -Geschwindigkeit ist umso schneller als die HTTP -Upload -Geschwindigkeit. Und schreiben Programme in Java; FTP ist bequemer als HTTP.
Der Autor verwendete einst VB und schrieb ActiveX -Steuerelemente zum Hochladen und Herunterladen von Stapeldateien, und seine Funktionen sind ebenfalls sehr leistungsfähig. Da es keine spezielle digitale Signatur für CAB -Dateien oder OCX gibt, ist es erforderlich, mühsame Einstellungen für den Kunden auszuführen, z.
Gleichzeitig wurde die digital signierte und verschlüsselte Dateien für den Client digital signiert und verschlüsselt. Es wurde beschlossen, Applet zu implementieren. . Vor dem Hochladen der Datei können die lokalen USBKey -Schlüsselinformationen vom Client erhalten werden, um die Verschlüsselungs- und Signaturverarbeitung der hochgeladenen Datei abzuschließen. Obwohl die Verwendung von Applet die Installation der JRE -Laufzeitumgebung auf dem Client erfordert, was dem Management und der Verwendung des Clients einige Unannehmlichkeiten bringt, kann es ein relativ kleiner Preis sein, die Sicherheit einer so großen Anzahl von Dateien und Dateien zu vergleichen.
Um die Betriebsumgebung zusammenzufassen:
FTP Server-Seite: Serv-U, ein professionelles FTP-Server-Seite, es gibt fertige Software-Downloads im Internet. Natürlich schreiben die Leser möglicherweise auch ein serverseitiges FTP-Dateiempfangsprogramm zum Erklären. Wenn es keine besonderen Anforderungen oder Funktionen gibt, sollte Serv-U in der Lage sein, unsere allgemeinen Upload- und Download-Anforderungen zu erfüllen.
Kunde: Java Applet, eine Technologie, die Java damals populär machte, behauptete, vergleichbar mit Microsoft's ActiveX zu sein. Natürlich hat Java Java FX. Ist es ein Ersatz für Applet?
Anwendungsumgebung: Internet, ultimative Zweck.
2. Auswahl der Java FTP Client Library
Stellen Sie uns ein Szenario vor - wir möchten eine reine Java -Anwendung schreiben, die Dateien von einem FTP -Server hochladen und herunterlädt, der auf einem Remote -Computer ausgeführt wird. Wir möchten auch grundlegende Dateiinformationen für diese Remote -Dateien zum Download abrufen, z. B. Dateinamen, Daten oder Dateigröße.
Während es möglich und vielleicht interessant ist, einen FTP -Protokollhandler von Grund auf neu zu schreiben, ist die Arbeit auch schwierig, lang und potenziell gefährlich. Da wir nicht bereit sind, Zeit, Energie oder Geld für das Schreiben eines solchen Verarbeitungsprogramms selbst zu verbringen, wenden wir uns wieder wiederverwendbare Komponenten zu, die bereits vorhanden sind. Und viele Bibliotheken sind online verfügbar.
Eine ausgezeichnete Java FTP -Client -Bibliothek zu finden, die zu unseren Bedürfnissen entspricht, ist nicht so einfach, wie es scheint. Im Gegenteil, dies ist eine sehr schmerzhafte und komplizierte Aufgabe. Erstens dauert es einige Zeit, um eine FTP -Client -Bibliothek zu finden. Nachdem wir alle vorhandenen Bibliotheken gefunden haben, welche sollten wir wählen? Jede Bibliothek ist für unterschiedliche Bedürfnisse geeignet. Diese Bibliotheken sind in der Leistung nicht gleichwertig und haben grundlegende Unterschiede in ihrem Design. Jede Bibliothek hat ihre eigenen Eigenschaften und verwendet verschiedene Begriffe, um sie zu beschreiben. Daher ist die Bewertung und Vergleich von FTP -Client -Bibliotheken eine schwierige Aufgabe.
Die Verwendung wiederverwendbarer Komponenten ist ein befürworteter Ansatz, aber in diesem Fall ist er zu Beginn häufig entmutigend. Später könnte ich mich ein wenig schämen: Nachdem ich eine gute FTP -Bibliothek ausgewählt habe, ist die nachfolgende Arbeit sehr einfach, einfach die einfachen Regeln befolgen. Gegenwärtig gibt es viele öffentliche und kostenlose FTP-Client-Bibliothek wie Simpleftp, J-FTP usw. und viele andere FTPClients. Wie in der folgenden Tabelle gezeigt, kann die Tabelle nicht alle aufgeführt werden. Wenn die Leser eine bessere Client -FTP -Klassenbibliothek haben, machen Sie weitere Ergänzungen.
In diesem Artikel nimmt der Autor J-FTP an. Dies ist eine Open Source und eine sehr leistungsstarke Client -FTP -Bibliothek. Der Autor mag es sehr und empfiehlt es auch allen Lesern. Vergessen Sie es kostenlos und machen Sie eine Werbung dafür.
1. Grundfunktionen
1. Anmelden
FTP wird für die Dateiübertragung verwendet, aber im Wesentlichen wird Java.net.Socket für die Kommunikation verwendet. Der folgende Code ist nur eine der Anmeldemethoden der Klasse net.sf.jftp.net.ftpconnection. Um das Layout zu speichern und einige Prinzipien im folgenden Code klar zu erklären, hat der Autor einige unnötige Codes wie Protokolle und andere Codes entfernt. Für den vollständigen Code finden Sie den Quellcode von J-FTP oder den Beispielquellencode des Autors. Die folgenden Codebeispiele sind gleich:
public int login (String -Benutzername, String -Passwort) {this.username = userername; this.Password = Passwort; int status = login_ok; jcon = new JConnection (Host, Port); if (jcon.ISthere ()) {in = jcon.getreader (); if (getline (positiv) == null) // ftp220_service_ready) == null) {ok = false; Status = offline; } if (! getline (loginack) .StartsWith (positiv)) // ftp230_logged_in)) {if (Erfolg (positiv)) // ftp230_logged_in)) {} else {OK = false; status = wachslogin_data; }}} else {if (msg) {log.debug ("ftp nicht verfügbar!"); ok = falsch; status = generic_failed; }} if (ok) {connected = true; System(); binär(); String [] advSettings = new String [6]; if (getOstype (). indexof ("os/2")> = 0) {list_default = "list"; } if (list.equals ("default")) {// Erhalten Sie einfach das erste Element (irgendwie weiß es zuerst der Befehl // ftp list) advSets = loadSet.loadset (Settings.Adv_Settings); // *** Wenn die Datei nicht gefunden wird, erstellen Sie sie und setzen Sie sie auf list_default if (advSettings == null) {list = list_default; Saveset s = new saveset (setts.adv_setings, list); } else {list = advSettings [0]; if (list == null) {list = list_default; }}} if (getOstype (). indexof ("mvs")> = 0) {list = "list"; } // *** FireDirectoryUpdate (this); FireconnectionInitialized (dies); } else {FireConNectionFailed (this, New Integer (Status) .ToString ()); } Rückgabestatus; } Bei dieser Anmeldemethode gibt es eine JConnection -Klasse, die für die Einrichtung von Sockelhöhlen verantwortlich ist. Gleichzeitig ist diese Klasse ein separater Thread. Der Vorteil besteht darin, dass, um mit Schnittstellenänderungen zusammenzuarbeiten, Netzwerk -Socket -Verbindungen und andere Aufgaben als separate Threads verarbeitet werden, was der Freundlichkeit der Schnittstelle förderlich ist. Unten finden Sie die Auslaufmethode von net.sf.jftp.net.jconnection class. Natürlich wird das Start dieses Threads im Konstruktor der JConnection -Klasse gestartet.
public void run () {try {s = neuer Socket (Host, Port); localport = S.GetLocalport (); // if (Zeit> 0) setsTotimeout (Zeit); out = new printstream (neuer bufferedOutputStream (S.GetOutputStream (), Setting.BufferSize)); in = neuer BufferedReader (neuer InputStreamReader (S.GetInputStream ()), Einstellungen.BufferSize); isok = wahr; //}} catch (Ausnahme ex) {ex.printstacktrace (); Log.out ("WARNUNG: Verbindung geschlossen aufgrund von Ausnahme (" + host + ":" + port + ")"); isok = false; try {if ((s! = null) &&! } if (out! = null) {out.close (); } if (in! = null) {in.close (); }} catch (exception ex2) {ex2.printstacktrace (); Log.out ("WARNUNG: Ich habe mehr Fehler, um Socket und Streams zu schließen"); }} etabliert = true; }Die Socket in dieser Laufmethode erklärt hier, dass diese Art der Implementierung von Client -Sockets (auch als "Sockets" bezeichnet), bei denen es sich um Kommunikationsendpunkte zwischen zwei Maschinen handelt. Die tatsächliche Arbeit der Socket wird durch eine Instanz der SocketImpl -Klasse durchgeführt. Eine Anwendung implementiert eine Socket -Fabrik, die Steckdosen erstellt, indem die Socket -Fabrik geändert wird, die sich so konfigurieren kann, dass sie für die lokale Firewall geeignet sind. Weitere Anweisungen finden Sie in den API -Anweisungen von JDK5, vorzugsweise auf Chinesisch. hehe.
2 Laden Sie hoch und laden Sie herunter und laden Sie sie herunter
Das Hochladen von Dateien kann in Multi-Threaded und Single-Threaded unterteilt werden, was in Einzel-Threaden-Situationen relativ einfach ist, während in Multi-Threaden-Situationen mehr Dinge behandelt und vorsichtiger sind. Unten finden Sie die Upload -Handladungsmethode von net.sf.jftp.net.ftpconnection. Zwei verschiedene Typen, Einzelfaden und Multi-Thread, wurden berücksichtigt.
public int handleUpload (String -Datei, String RealName) {if (settings.getenableMultitHhreading () && (! setts.getNoppoadMultitHhreading ())) {log.out ("Laichen neuer Thread für diesen Upload"); Ftptransfer t; if (realname! } else {t = new ftptransfer (host, port, getLocalPath (), getCachedPwd (), Datei, Benutzername, Passwort, Transfer.Upload, Handler, Hörer, CRLF); } lastTransfer = t; return New_transfer_spawned; } else {if (Settings.getNoUploadMultitHhreading ()) {log.out ("MultitHhreading hochladen ist deaktiviert."); } else {log.out ("multithreading ist vollständig deaktiviert."); } return (realName == null)? Upload (Datei): Upload (Datei, RealName); }} Bei Multi-Threading gibt es eine separate Klasse net.sf.jftp.net.ftptransfer. Natürlich muss diese Klasse im Fall von Multi-Threading ein separater Thread sein. Ähnlich wie bei JConnection wird auch das Start seines Threads im Konstruktor gestartet. In seiner Run -Methode wird die Datei gelesen und übertragen.
public void run () {if (handler.getConnections (). get (file) == null) {Handler.AddConnection (Datei, this); } else if (! pause) {log.debug ("Übertragung bereits in Arbeit:" + Datei); Arbeit = falsch; stat = 2; zurückkehren; } boolean haspaused = false; while (pause) {try {runner.sleep (100); if (hörer! }} if (! work) {if (listener! }}}} catch (Ausnahme ex) {} HaSpaused = true; } while ((Handler.getConnectionSIZE ()> = Settings.getMaxConnections ()) && (Handler.getConnectionSize ()> 0) && Arbeit) {try {stat = 4; Runner.sleep (400); if (! HaSpause && (Hörer! }} else {break; }} catch (Ausnahme ex) {ex.printstacktrace (); }} if (! work) {if (listener! }} handler.removeconnection (Datei); stat = 3; zurückkehren; } start = true; try {runner.sleep (setts.ftptransferthreadPause); } catch (Ausnahme ex) {} con = new ftpConnection (Host, Port, remotepath, crlf); con.setConnectionHandler (Handler); con.setConnectionListeners (Hörer); int status = con.login (Benutzer, Pass); if (status == ftpConnection.login_ok) {Datei f = Neue Datei (LocalPath); con.setLocalPath (f.getabsolutepath ()); if (type.equals (hochladen)) {if (newname! = null) {transfererstatus = con.Upload (Datei, NewName); } else {transfererstatus = con.Upload (Datei); }} else {transfererstatus = con.download (Datei, this.newname); }} if (! pause) {handler.removeconnection (Datei); }} Was den Download -Prozess betrifft, da es sich um einen inversen Upload -Prozess handelt, ähnelt es der Upload -Methode und der Schreibmethode. Aus einigen Gründen ist der Code nicht aufgeführt, aber seine Ideen und Ideen sind genau gleich. Weitere Informationen finden Sie im Quellcode für Leser.
4. Fortschrittsbalken
Es kann vorgestellt werden, dass der Benutzer nicht beurteilen kann, ob die Aufgabe erledigt ist oder ob die Aufgabe tot ist, und der Benutzer ist aufgrund der Upload -Zeit oder der Download -Zeit, die zu lang ist, häufig irreführend, wenn die Aufgabe tot ist. Daher ist der Fortschrittsbalken sehr wichtig und praktisch.
Die Implementierung der Fortschrittsleiste ist eigentlich sehr einfach. Es soll zwei Threads im Programm öffnen. Der erste Thread wird verwendet, um den Wert der Fortschrittsleiste auf der Schnittstelle dynamisch zu ändern, während der zweite Thread während des Uploads oder des Downloads eine Schleife bildet. In dieser Schleife werden jedes Mal eine bestimmte Anzahl von Daten wie 8192 Bytes gelesen. Rufen Sie nach dem Übergeben dieser Daten die Aktualisierungsprogress -Methode im ersten Thread auf, um den Wert der Schnittstellen -Fortschrittsleiste zu aktualisieren.
Während des Upload- oder Download -Vorgangs (siehe die Ausführungsmethode der FTPTransfer -Klasse im vorherigen Abschnitt) können Sie die Methode con.Upload (Datei, Newname) anzeigen, der Code ist wie folgt.
public int upload (String -Datei, String RealName, InputStream in) {hasUploaded = true; Log.out ("FTP -Upload gestartet:" + dies); int stat; if ((in == null) && neue Datei (Datei) .isDirectory ()) {ShortProgress = true; fileCount = 0; BaseFile = Datei; DataType = DataConNection.putDir; isdirupload = true; stat = uploadDir (Datei); ShortProgress = False; //System.out.println(FileCount + ":" + baseFile); FireProgressUpdate (BaseFile, DataConnection.DFINISHEDEDEL + ":" + fileCount, -1); fireactionFineSted (this); FireDirectoryUpdate (dies); } else {DataType = DataConNection.put; stat = rawUpload (Datei, Realname, in); try {thread.sleep (100); } catch (Ausnahme ex) {} fireactionFineSteured (this); FireDirectoryUpdate (dies); } try {thread.sleep (500); } catch (Ausnahme ex) {} return stat; }Diese Methode ist für das Hochladen einer bestimmten Anzahl von Bytes verantwortlich. Tatsächlich wird es als RawUpload -Methode bezeichnet. Es ist hier nicht aufgeführt. Bitte beachten Sie den Quellcode. Nachdem diese Bytedaten übergeben haben, wird die Methode "updateProgressBar () im Haupt -Thread aufgerufen, indem die Methode fIRActionFineIned () aufgerufen wird. Eigentlich lautet der Code wie folgt:
protected void updateProgressBar () {int Prozent = (int) (((float) lFileCompletesize / (float) lFileSize) * 10000F); pbFile.setValue (Prozent); // system.out.println ("=============================================="+Prozent); pbFile.setString (LFileCompletesize / 1024L + " /" + lfileSize / 1024L + "KB"); Prozent = (int) (((float) ltotAlCompletesize / (float) ltotalSize) * 10000F); pBtotal.setString (ltotAlCompletesize / 1024L + " /" + ltotalSize / 1024L + "KB"); pbtotal.setValue (Prozent); Repaint (); } Zwei Fortschrittsbalken werden oben verwendet. Die erste Fortschrittsleiste repräsentiert den Fortschritt oder den Download -Fortschritt der aktuellen Datei, und die zweite Fortschrittsleiste repräsentiert den Fortschritt aller Dateien herunterladen oder hochladen. Gleichzeitig wird der Maximalwert der Fortschrittsbalken auf 10.000 bis pbFile eingestellt. Der Autor ist der Ansicht, dass dies besser ist, denn manchmal beim Hochladen oder Herunterladen können die Änderungen aus Netzwerkgründen relativ gering sein. Wenn es auf 100 eingestellt ist, ist die Änderung nicht besonders offensichtlich.
Das obige ist der grundlegende Artikel zum Hochladen und Herunterladen großer Stapel von FTP -Dateien. Ich hoffe, es wird für das Lernen aller hilfreich sein, und ich hoffe, jeder wird Wulin.com mehr unterstützen.