FTP Probleme mit Passiv und Binary Mode

tobi193

Aktives Mitglied
Hallo,
ich sitze nun schon den halben Tag an folgedem Problem:
Ich habe ein kleines Tool geschrieben um Daten auf einen FTP-Server zu laden und auch abrufen zu können. Das klappt soweit ganz gut. Allerdings kann ich die Dateien nur einmal abrufen, beim 2. mal kommt immer ein Fehler:

Java:
< 220 FTP on *********server.com ready
> USER f00441c4
< 331 Password required for f00441c4
> PASS Dz4oMQ**********
< 230 User f00441c4 logged in
> TYPE I
< 200 Type set to I
       // Methode list() wird aufgerufen beim Programmstart
> PASV
< 227 Entering Passive Mode (85,13,143,176,195,107).
> LIST
       // Aktualisierung, erneuter Aufruf von list()
> PASV
< 150 Opening BINARY mode data connection for file list
> LIST
port out of range:-1


Die Methode list();
Java:
    public ArrayList<String> list() throws IOException{
        
        sendLine("PASV");
        String response = readLine();


        String ip = null;
        int port = -1;
        int opening = response.indexOf('(');
        int closing = response.indexOf(')', opening + 1);
        if(closing > 0){
            String dataLink = response.substring(opening + 1, closing);
            StringTokenizer tokenizer = new StringTokenizer(dataLink, ",");
            ip = tokenizer.nextToken() + "." + tokenizer.nextToken() + "." + tokenizer.nextToken() + "." + tokenizer.nextToken();
            port = Integer.parseInt(tokenizer.nextToken()) * 256 + Integer.parseInt(tokenizer.nextToken());
        }

        sendLine("LIST");
        Socket sock = new Socket(ip, port);
        BufferedReader bin = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        ArrayList<String> files = new ArrayList<String>();
        String s;

        while((s = bin.readLine()) != null){
            String[] teile = s.split(" ");
            if(teile[0].startsWith("d")){
                if(!teile[teile.length - 1].startsWith("."))
                files.add("|" + teile[teile.length - 1]);
            }else{
                files.add(teile[teile.length - 1]);
            }
        }
        bin.close();
        return files;
    }

Das Datei hochladen klappt auch prima, aber sobald ich die Methode list() einmal aufgerufen habe bricht dabei die Verbindung zusammen. Kommentiere ich jedoch den Methodenaufruf von list() aus, geht das Fehlerfrei.

Ich hoffe mir kann einer den entscheidenen Tip geben.

Gruß tobi
 
Zuletzt bearbeitet:
Naja, scheinbar wird noch die alte Transferverbindung genommen und du versuchst immer wieder eine neue aufzumachen. Beim 2. Mal fehlt die natürlich der Port.
 
Das versteh ich jetzt nicht ganz. Der Port fehlt so wie es aussieht weil auf das erneute PASV aufrufen nicht mehr die Passivmode bestätigung (< 227 Entering Passive Mode (85,13,143,176,195,100)) kommt sondern nur 226 Transfer complete.
Wie soll ich darauf reagieren, offenbar nimmt er ja jedes mal einen neuen Port.
 
Also von 226 Transfer complete steht nichts in deinem Log.
Versuch den Socket zu schließen, versuch die Verbindung aufrecht erhalten um zu gucken, was da passiert, versuch dich zum Port vom letzten Mal zu verbindung.
Optional kannst du auch KSKB reinstellen.
 

Neue Themen


Zurück
Oben