Anwendung friert bei .listNames() ein!

  • Themenstarter Themenstarter jf
  • Beginndatum Beginndatum

jf

Bekanntes Mitglied
Und wieder habe ich ein Problem... 🙁

Ich möchte von einem ftp-Server Dateien laden.
Dafür verwende ich folgenden Quelltext:
Java:
package ftp;


import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;


public class FTP {

    private static FTPClient ftp = new FTPClient();
         
        try {
            ftp.connect("...");
            System.out.print(ftp.getReplyString());
            ftp.login("...", "...");
            System.out.print(ftp.getReplyString());
            
            if(!FTPReply.isPositiveCompletion( ftp.getReplyCode() )) {
                ftp.disconnect();
                System.out.println("MIST!");
                return;
            }
            
            String[] names = ftp.listNames();

            if(names.length > 0) {
                System.out.println(names[0]);
            }
            
            ftp.logout();
        } catch (FileNotFoundException e) {
            System.out.println("File not found!");
        } catch (IOException e) {
            System.out.println("IOException while trying to download from ftp server!");
        } finally {
            try {
                ftp.disconnect();
            } catch(IOException ioe) {
                // do nothing
            }
        }
    }
}

Das Einloggen müsste funktioniert haben, wie folgende Ausgabe auf der Konsole zeigt:
Code:
220 ProFTPD 1.3.1 Server (ProFTPD) [...]
230 User ... logged in

Bei
Java:
String[] names = ftp.listNames();
friert meine Anwendung allerdings komplett ein.
Was mache ich falsch??? ;(
 
Zuletzt bearbeitet:
Hi,

da wir den Code von FTPClient nicht kennen, können wir dir wohl nicht weiterhelfen :-(
In der Methode "listNames()" der Klasse "FTPClient" scheint dein Programm ja stecken
zu bleiben.

EDIT: UPS! Sehe gerade das der Client aus einem Apache-Paket kommt, sorry! Dann
besorg dir vielleicht die Quellen des Pakets, binde sie in deine IDE ein und debugge
mal.
 
da wir den Code von FTPClient nicht kennen, können wir dir wohl nicht weiterhelfen :-(
In der Methode "listNames()" der Klasse "FTPClient" scheint dein Programm ja stecken
zu bleiben.
Ich habe also in der Anwendung nichts falsch gemacht?

EDIT: UPS! Sehe gerade das der Client aus einem Apache-Paket kommt, sorry! Dann
besorg dir vielleicht die Quellen des Pakets, binde sie in deine IDE ein und debugge
mal.
Kann es denn wirklich sein, dass in einer Apache-Bibliothek solch ein schwerwiegender Fehler steckte?
Da Problem müsste doch auch bei anderen Anwendern bereits aufgetreten sein.

Gibt es Alternativen, welche zu empfehlen sind?
 
Es muss jetzt nicht heissen das in der Lib von Apache der Fehler drin steckt. Aber auf jeden Fall
hängt deine Anwendung irgendwo in dem Code von Apache. Daher auch der Tipp für das
Debugging.
Schau dir vielleicht noch mal ein paar Beispiele für die Verwendung der Lib und deren Dokumentation
an, vielleicht haste noch was übersehen.
 
Schau dir vielleicht noch mal ein paar Beispiele für die Verwendung der Lib und deren Dokumentation an, vielleicht haste noch was übersehen.
Ja, danach habe ich als allererstes gesucht - aber nur andere Beispiele gefunden (speichern von Dateien im ftp-Verzeichnis usw.)
Daher habe ich mich vertrauensvoll an dieses Forum gewandt, in der Hoffnung, dass hier jemand einen schnellen Tipp parat hat. 🙂
 
Ich vermute einfach mal dass du mal den Passive-Mode aktivieren sollst. So wie es gerade ist, versucht nämlich der Server eine TCP-Verbindung zu deinem Rechner aufzubauen. Sobald du eine Firewall laufen hast oder hinter einem Router sitzt, der das nicht unterstützt, passiert wie du schon gemerkt hast: nichts.
 
API-Doc zu FTPClient öffnen und nach "passive" suchen?
Ich war gestern nur über Handy im Netz, was die Suche etwas erschwerte...

Nein, ich mach das jetzt nicht für dich.
Tut mir leid, ich dachte, du wüsstest gleich aus dem Kopf was zu machen ist. 🙂

Also, ich habe jetzt folgende zwei Methoden gefunden:

Code:
 void 	enterLocalPassiveMode()
          Set the current data connection mode to PASSIVE_LOCAL_DATA_CONNECTION_MODE .
Code:
 boolean 	enterRemotePassiveMode()
          Set the current data connection mode to  PASSIVE_REMOTE_DATA_CONNECTION_MODE .

Welche von beiden soll ich nehmen?
Muss ich diese einfach kurz nach dem Einloggen ausführen und das wars?
 
Also, ich habe jetzt folgende zwei Methoden gefunden:
Ich habe es nun mit
Code:
ftp.enterLocalPassiveMode();
probiert und
Code:
ftp.listNames();
lieferte mir sofort alle Dateinamen - ein einfacher Aufruf hat also genügt. 🙂

Übrigens: die Verwendung von
Code:
enterRemotePassiveMode();
führte zu einer Nullpointer-Exception.

Gruß, jf

Edit: Problem hat sich erledigt. 😀
 
Zuletzt bearbeitet:

Zurück
Oben