# Anwendung friert bei .listNames() ein!



## jf (8. Okt 2010)

Und wieder habe ich ein Problem... 

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

```
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:

```
220 ProFTPD 1.3.1 Server (ProFTPD) [...]
230 User ... logged in
```

Bei 
	
	
	
	





```
String[] names = ftp.listNames();
```
 friert meine Anwendung allerdings komplett ein.
Was mache ich falsch??? ;(


----------



## gman (8. Okt 2010)

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.


----------



## jf (9. Okt 2010)

gman hat gesagt.:


> 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?



gman hat gesagt.:


> 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?


----------



## gman (9. Okt 2010)

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.


----------



## jf (9. Okt 2010)

gman hat gesagt.:


> 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.


----------



## HoaX (10. Okt 2010)

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.


----------



## jf (10. Okt 2010)

HoaX hat gesagt.:


> Ich vermute einfach mal dass du mal den Passive-Mode aktivieren sollst.


Danke für den Tipp!!
Kannst du mir auch gleich sagen, wie das geht?


----------



## HoaX (11. Okt 2010)

jf hat gesagt.:


> Danke für den Tipp!!
> Kannst du mir auch gleich sagen, wie das geht?



API-Doc zu FTPClient öffnen und nach "passive" suchen? Nein, ich mach das jetzt nicht für dich.


----------



## jf (11. Okt 2010)

HoaX hat gesagt.:


> API-Doc zu FTPClient öffnen und nach "passive" suchen?


Ich war gestern nur über Handy im Netz, was die Suche etwas erschwerte...



HoaX hat gesagt.:


> 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:


```
void 	enterLocalPassiveMode()
          Set the current data connection mode to PASSIVE_LOCAL_DATA_CONNECTION_MODE .
```


```
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?


----------



## jf (11. Okt 2010)

jf hat gesagt.:


> Also, ich habe jetzt folgende zwei Methoden gefunden:


Ich habe es nun mit 
	
	
	
	





```
ftp.enterLocalPassiveMode();
```
 probiert und 
	
	
	
	





```
ftp.listNames();
```
 lieferte mir sofort alle Dateinamen - ein einfacher Aufruf hat also genügt. 

Übrigens: die Verwendung von 
	
	
	
	





```
enterRemotePassiveMode();
```
 führte zu einer Nullpointer-Exception.

Gruß, jf

Edit: Problem hat sich erledigt.


----------



## SlaterB (11. Okt 2010)

teste

FileOutputStream out = ..;
ftp.retrieveFile("file.txt", out);
out.flush();
out.close();


----------



## jf (11. Okt 2010)

SlaterB hat gesagt.:


> teste
> 
> FileOutputStream out = ..;
> ftp.retrieveFile("file.txt", out);
> ...


Man kam die Antwort schnell...
Ja, das "file.txt" war das Problem - das war nur ein Platzhalter und der Grund, weshalb es eben nicht ging.


----------

