Probleme mit FTP

Mansent

Mitglied
Hallo zusammen.

Ich möchte mit der apache commons library eine Verbindung zu einem FTP-Server herstellen und ein Verzeichnis auslesen (und später auch dateien hoch und ruterladen, ist abr noch nicht implementiert.) Ich habe dazu folgende Klasse geschrieben:

Java:
import org.apache.commons.net.ftp.*;
import java.io.*;

public class FTPControl
{
    private FTPClient ftp;
    private String server, username, password;
    private boolean error;
    
    /**
     * Constructor for objects of class FTPControl
     */
    public FTPControl(String server, String username, String password)
    {
        ftp = new FTPClient();
        error = false; 
        connect();
    }
    
    private void connect()
    {
        //Verbindung herstellen
        try
        {
            int reply;
            ftp.connect(server);
            System.out.println("Connected to " + server + ".");

            // After connection attempt, you should check the reply code to verify
            // success.
            reply = ftp.getReplyCode();

            if (!FTPReply.isPositiveCompletion(reply))
            {
                ftp.disconnect();
                System.err.println("FTP server refused connection.");
            }
        }
        catch (IOException e)
        {
            if (ftp.isConnected())
            {
                try
                {
                    ftp.disconnect();
                }
                catch (IOException f)
                {
                }
            }
            System.err.println("Could not connect to server.");
            e.printStackTrace();
            System.exit(1);
        }
        
        //Einloggen
        try
        {
            if (!ftp.login(username, password))
            {
                ftp.logout();
                error = true;
            }

            System.out.println("Remote system is " + ftp.getSystemName());

            ftp.setFileType(FTP.BINARY_FILE_TYPE);

            ftp.enterLocalPassiveMode();
            
            if (ftp.isConnected())
            {
                MainManager.setStatus("Mit " + server + " verbunden."); 
            }
        }
        catch (FTPConnectionClosedException e)
        {
            error = true;
            System.err.println("Server closed connection.");
            e.printStackTrace();
        }
        catch (IOException e)
        {
            error = true;
            e.printStackTrace();
        }
        finally
        {
            if (ftp.isConnected())
            {
                try
                {
                    ftp.disconnect();
                }
                catch (IOException f)
                {
                }
            }
        }
    }
    
    public void disconnect()
    {
        try
        {
            ftp.logout();
            ftp.disconnect();
        }
        catch (IOException e)
        {
        }
    }
    
    public void getFiles()
    {
        if(!ftp.isConnected())
        {
            connect();
        }
        try
        {
            FTPFile[] files = ftp.listFiles();
            for(FTPFile f : files)
            {
                System.out.println(f.getName());
            }
        }
        catch (IOException e)
        {
            System.out.println("Auslesen der Dateien Fehlgeschlagen");
            e.printStackTrace();
        }
    }
}

Ich hab im wesentlichen die Implementierung aus dem überall zu findendem Beispiel übernommen. Ich bekomme jedoch immer nur die Fehlermeldung
Could not connect to server.
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:171)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:192)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:285)
at FTPControl.connect(FTPControl.java:37)
at FTPControl.<init>(FTPControl.java:28)
at __SHELL5$1.<init>(__SHELL5.java:10)
at __SHELL5.run(__SHELL5.java:5)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)

An meinem FTP-Server liegt es nicht. Ich hab schon mehrere FTP-Server durchprobiert.

Wie kann ich da vorgehen? hat jemand eine Idee woran das liegen könnte?
 

c_sidi90

Top Contributor
Du verbindest dich auch zu keinem Server, da du die Parameter im Konstruktor nicht an die Klassenvariablen übergibst.

Java:
this.server = server;
this.user = user;
this.password = password;

sag bescheid obs hilft, bin mir ziemlich sicher
 

Mansent

Mitglied
ich hatte diese Variablen erstmal im Konstruktor von Hand gesetzt. Ich wollte meine FTP-Zugangsdaten nur nicht ins Forum stellen, daher habe ich beim schreiben des Posts diese Zeilen kurz entfernt und vergessen, diese Variablen zu aus den Parametern zu übernehmen.

Daran liegt es leider nicht :(
 

c_sidi90

Top Contributor
Also "could not connect to server" spricht aber dafür, bei mir funktioniert dein Code mit dem richtigen Konstruktor. Hast du auch die richtigen Daten für dein FTPUser ?
 

Mansent

Mitglied
Ah ich hab endlich den Fehler gefunden.

Ich hatte im Konstruktor wie bereits erwähnt die Variablen von Hand gesetzt. Dies Tat ich wie folgt:
Java:
        server = "<URL>";
        username = "<Benutzername>";
        password = "<Password>";
Damit habe ich natürlich nur die lokalen Variablen des Konstruktors verändert.
Richtig wäre gewesen:
Java:
        this.server = "<URL>";
        this.username = "<Benutzername>";
        this.password = "<Password>";

Vielen Dank für alle Hilfe. Ohne dich hätte ich den Fehler vermutlich nicht gefunden und das Projekt aufgegeben.
 

Mansent

Mitglied
Ne, es ist leider doch nicht alles in Ordnung.

Wenn ich jetzt getFiles() aufrufe, bekomme ich eine java.io.IOException: Connection is not open

Ich verstehe nicht was an meiner Methode falsch ist. Die Connect-Methode funktioniert doch jetzt und ich prüfe ja am Anfang der Methode if(!ftp.isConnected()) { connect(); }. Hast du da eine Idee was da schief läuft?
 

homer65

Top Contributor
Ich finde in deinem Code nirgentwo eine Stelle wo du Userid und Passwort angibst.
Nach dem Connect muss noch ein Login kommen.
Hier mal ein Beispiel:
[Java]
ftp.connect(host);
String rc = ftp.getReplyString();
System.out.println(rc);
ftp.login(benutzer,passwort);
rc = ftp.getReplyString();
System.out.println(rc);
[/Java]
 

c_sidi90

Top Contributor
Wie mein Vorposter schon gesagt hat, logst du dich nicht ein sondern verbindest dich nur. Zu deinem ersten Problem: Ich habs in meinem ersten Post doch genau erklärt, das du die Variablen mit "this." setzen musst du Pappnase
 

Mansent

Mitglied
Entschuldigung, das ist wirklich ein grober Fehler. Das liegt wahrscheinlich daran, dass ich seit 2 Tagen Krank im Bett liege. Deswegen werde ich das Problem ein paar Tage vertagen.
 

Mansent

Mitglied
So, wieder gesund ;)

Ich habe eingesehen, dass meine Klasse nicht grade optimal gegliedert war, deshalb habe ich die Klasse komplett nochmal neu mit bersserem Klassendesign geschrieben:
Java:
package FileManagement;

import org.apache.commons.net.ftp.*;
import java.io.*;


/**
 * Write a description of class FTPControl here.
 * 
 * @author Manuel
 * @version 1.0
 * @since 1.0
 */
public class FTPControl
{
    private FTPClient ftp;
    private String server, username, password;
    private int port;
    
    /**
     * Constructor for objects of class FTPControl
     */
    public FTPControl(String server, String username, String password, int port)
    {
        ftp = new FTPClient();
        this.server = server;
        this.username = username;
        this.password = password;
        this.port = port;
        connect();
    }
    
    public void connect()
    {
        try 
        {
            ftp.connect(server, port);
            System.out.println(ftp.getReplyString());
            
            ftp.login(username, password);
            System.out.println(ftp.getReplyString());
            
            ftp.enterLocalPassiveMode();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        } 
    }
    
    public void disconnect()
    {
        try 
        {
            boolean logout = ftp.logout();
            if (logout) 
            {
                System.out.println("Logout from FTP server...");
            }
            ftp.disconnect();
            System.out.println("Disconnected from " + server);
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
    
    public void getFiles()
    {
        if(!ftp.isConnected())
        {
            connect();
        }
        try
        {
            FTPFile[] files = ftp.listFiles();
            for(FTPFile f : files)
            {
                System.out.println(f.getName());
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

Das Verbinden klappt auch jetzt wunderbar, aber beim auslesen der Dateien bekomme ich eine java.net.SocketException: Connection reset
Woran kann das denn liegen? An der Firewalll liegt es auf jedenfall nicht und an meinem Code denke ich auch nicht, weil dieser so auch in Beispielen zu finden ist.
 

Mansent

Mitglied
hier:
Konsole:
220 FTP Server ready.

230 User u63214632 logged in
Error:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:189)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.read(BufferedReader.java:175)
at org.apache.commons.net.io.CRLFLineReader.readLine(CRLFLineReader.java:58)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:310)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:290)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:479)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:552)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:601)
at org.apache.commons.net.ftp.FTP.pasv(FTP.java:952)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:755)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:657)
at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3097)
at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3072)
at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2731)
at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2778)
at FileManagement.FTPControl.getFiles(FTPControl.java:87)
at FileManagement.__SHELL1.run(__SHELL1.java:8)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
 

tagedieb

Top Contributor
Ok, verbindung scheint ja ok zu sein...

Hast du den die Berechtigungn um das Root verzeichnis zu lesen? Ev. muss du noch ein gueltiges Remoteverzeichnis setzen
Code:
ftp.changeWorkingDirectory(..)

Ansonsten wuerd ich mal FTP Commandos mit dem Command-Line FTP-Client durchspielen, wenns da klappt sollte es ja auch in deiner Applikation funktionieren.
 

Mansent

Mitglied
Ich habs probiert, ich habe die Berechtigung das root-Verzeichnis auszulesen. Sonst vorher den Ordner wechseln bringt auch nichts. Die Kommandos funktionieren auch aber es entsteht immer noch dieser komische fehler :(
 

homer65

Top Contributor
Etwas suspekt ist mir:
[Java]
ftp.enterLocalPassiveMode();
[/Java]
Dahinter fehlt:
[Java]
System.out.println(ftp.getReplyString());
[/Java]
Vielleicht kommt da ja eine Fehlermeldung.
 

Mansent

Mitglied
Ne, der FTP-Server ist von 1und1 und völlig in Ordnung.

Und ich bin jetzt zwei Wochen in Urlaub und das Problem muss schon wieder warten :mad:
 

Mansent

Mitglied
Oh da haben wir wohl gleichzeitig gepostet.

Dass da kein System.out.println(ftp.getReplyString()); steht, liegt daran, dass dort kein neuer Replystring ausgegeben wird. Schreibe ich das System.out.println(ftp.getReplyString()); dahinter erscheint in der Konsole zwei mal 230 User u63214632 logged in.
 

homer65

Top Contributor
Wie auch immer.
java.net.SocketException: Connection reset
Ist kein Fehler des Programms, sondern irgendetwas kappt die Netzwerkverbindung von aussen.
Was auch immer es ist, du findest es nicht im Programm.

Deswegen mein Hinweis auf den FTP Server. Wenn du die Möglichkeit hast, lohnt sich auf jeden Fall ein Blick ins Log.
Ich weiss leider nicht welche Möglichkeiten 1und1 da bietet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
platofan23 Probleme mit Socket bei Android Studio? Netzwerkprogrammierung 22
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
Niggo_ Probleme mit Java Mail Netzwerkprogrammierung 14
F Probleme mit Connection Reset bei Telnet Verbindung Netzwerkprogrammierung 1
K Probleme bei HTML-Mail-Abruf mit IMAP bei 1und1 Netzwerkprogrammierung 2
L Socket SSLServer Probleme Netzwerkprogrammierung 0
H Probleme mit UDP Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
R Probleme mit JMS Netzwerkprogrammierung 1
A Probleme beim Klassen-Import von sun.misc. ... Netzwerkprogrammierung 19
M RMI RMI Probleme zwischen Client und Server Netzwerkprogrammierung 5
B Probleme beim ersten Netzwerkprogramm Netzwerkprogrammierung 3
windl URLConnection unter 1.7 macht Probleme Netzwerkprogrammierung 14
Z Socket Probleme beim Senden und Empfangen Netzwerkprogrammierung 5
Z Probleme beim Senden von Nachrichten an den Server Netzwerkprogrammierung 9
Maxim6394 Probleme bei Messenger Netzwerkprogrammierung 16
I Socket UDP Hole Punching bereitet Probleme Netzwerkprogrammierung 14
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
S HTTP Probleme mit POST-Befehl Netzwerkprogrammierung 2
R FTPS - Probleme mit FTPSClient Netzwerkprogrammierung 2
S Probleme mit XMLEncoder/XMLDecoder Netzwerkprogrammierung 2
D Server - Client Probleme Netzwerkprogrammierung 9
Weiti HTTP Zertifikat-Probleme - InstallCert.java Netzwerkprogrammierung 2
M Socket Probleme mit einfacher Socketverbindung Netzwerkprogrammierung 3
H Probleme mit GUI (RMI) Netzwerkprogrammierung 6
T RMI Probleme mit RMI-Server Netzwerkprogrammierung 4
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
T FTP Probleme mit Passiv und Binary Mode Netzwerkprogrammierung 3
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
S Socket SocketServer und Client machen Probleme Netzwerkprogrammierung 6
B Server / Client Anwendung, Client GUI Probleme Netzwerkprogrammierung 11
F RMI probleme Netzwerkprogrammierung 3
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
E jPcap Probleme Netzwerkprogrammierung 3
B HTTP Probleme mit HttpClient? Netzwerkprogrammierung 2
T Probleme mit Jpcap Netzwerkprogrammierung 18
P Probleme mit OutputStream Netzwerkprogrammierung 7
P Probleme beim weiter senden von Datein Netzwerkprogrammierung 10
B Probleme mit FTP verbindung Netzwerkprogrammierung 22
L Probleme bei Chatserver Netzwerkprogrammierung 6
A Probleme mit kleinem Netzwerk Programm Netzwerkprogrammierung 30
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
G Probleme mit SecruityManager + RMI Netzwerkprogrammierung 10
derMartin Probleme mit NNTP Client Netzwerkprogrammierung 2
A Probleme mit Citrix Netzwerkprogrammierung 17
A Probleme mit kleinem Messenger-Programm Netzwerkprogrammierung 4
K RXTXcomm : Install - Probleme Netzwerkprogrammierung 7
R Probleme mit UDP Netzwerkprogrammierung 4
P Probleme bei Chat programm Netzwerkprogrammierung 2
I Probleme mit 'JSSE Samples' von Sun Netzwerkprogrammierung 5
T RMI - Probleme beim Starten des Clients Netzwerkprogrammierung 4
E InetAddress Klasse-Probleme Netzwerkprogrammierung 4
M dateien übertragen, probleme mit versch. Strömen? Netzwerkprogrammierung 4
R Rechte Probleme bei Applets Netzwerkprogrammierung 16
D EA-Exception Network Adapter macht probleme Netzwerkprogrammierung 2
G Probleme mit Firewall beim empfangen von dateien über socket Netzwerkprogrammierung 6
P Probleme mit Input- / Output-Streams Netzwerkprogrammierung 2
V probleme mit dem chat programm Netzwerkprogrammierung 4
F WLAN Probleme (CLIENT-SERVER) Netzwerkprogrammierung 4
J Probleme mit ObjectOutputStream! Netzwerkprogrammierung 15
S Probleme beim Beschränken der Geschwindigkeit Netzwerkprogrammierung 6
M Probleme beim Abfangen von Streams Netzwerkprogrammierung 5
G Fragen/Probleme mit JavaMail Netzwerkprogrammierung 2
N Java-Chat (lauffähig) macht Probleme auf der Konsole Netzwerkprogrammierung 6
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
C Probleme bei Dateiupload mit socket Netzwerkprogrammierung 4
T FTP Chatprogramm probleme Netzwerkprogrammierung 2
C RMI Probleme mit iptables Netzwerkprogrammierung 2
D socket exception + timing probleme Netzwerkprogrammierung 2
G Probleme bei Proxy-Server! Netzwerkprogrammierung 5
S Probleme mit HttpURLConnection Netzwerkprogrammierung 10
D Habe 2 Probleme: Input eingabe und Multi Socket Server Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben