tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
12
ZUGRIFFE
640
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Hallo!

    Ich downloade/uploade per ftp Bilder von einem FTP-Server.

    Ich verwende hierfür: org.apache.commons.net.ftp.FTPClient

    Aber an der Stelle(bei listFiles):

    Code :
    1
    2
    3
    4
    
    if (ftpClient.isConnected())
    {
           serverFiles = ftpClient.listFiles(SERVER_DIR);
    }

    kommt folgende Exception:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    java.net.SocketTimeoutException: connect timed out
        at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:75)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:337)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:198)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
        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.ftp.FTPClient._openDataConnection_(FTPClient.java:726)
        at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2990)
        at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2965)
        at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2623)
        at xxx.xxx.objects.Ftp$UpdateTask.doInBackground(Ftp.java:292)
        at xxx.xxx.objects.Ftp$UpdateTask.doInBackground(Ftp.java:1)
        at org.jdesktop.swingworker.SwingWorker$1.call(Unknown Source)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at org.jdesktop.swingworker.SwingWorker.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)

    Es tritt nicht immer auf, nur manchmal.
    An was kann das liegen?

    Im Verzeichnis was ich mir holen möchte liegen ca 5 Bilder mit jeweils 10KB.
    Also die Größe kann es nicht sein.

    Bitte um Hilfe
     

  2. #2
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    Wie schnell ist deine Verbindung zu dem Server (ping, SpeedTest)? Ist der Server vielleicht überlastet? Wan öffnest du die Verbindung? Vielleicht kann der Server die Verbindung nicht halten, d.h. wenn du ein Verzeichnis auflistest, ein bisschen wartest und dann noch mal ein Verzeichnis wartest, könnte die Wartezeit dazwischen das Problem sein.
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  3. #3
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Ich hab mit Ping:

    Ping wird ausgeführt für xxx.xxx.xxx[xx.xx.xx.xxx] mit 32 Bytes Daten:
    Antwort von xx.xx.xx.xxx: Bytes=32 Zeit=45ms TTL=54
    Antwort von xx.xx.xx.xxx: Bytes=32 Zeit=46ms TTL=54
    Antwort von xx.xx.xx.xxx: Bytes=32 Zeit=44ms TTL=54
    Antwort von xx.xx.xx.xxx: Bytes=32 Zeit=45ms TTL=54

    Ping-Statistik für xx.xx.xx.xxx:
    Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
    (0% Verlust),
    Ca. Zeitangaben in Millisek.:
    Minimum = 44ms, Maximum = 46ms, Mittelwert = 45ms


    Der Server ist glaub ich nicht überlastet. Ist ein privater bei meinem Schwager.
    Aber wie könnte ich überprüfen ob er überlastet ist?

    Die Verbindung öffne ich 2 Zeilen vorher:
    Code :
    1
    2
    3
    4
    
    ftpClient.enterLocalPassiveMode();
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    ftpClient.setConnectTimeout(20000);
    ftpClient.setDataTimeout(20000);

    Ich öffne die Verbindung, hole mir das Verzeichnis vom Host und vergleiche es mit dem lokalen.
    Dann werden gegebenfalls Bilder up bzw downgeloaded. Danach wird die Verbindung geschlossen.

    Das ist der Update-Prozess der gleich beim Start des Programms gemacht wird.
     

  4. #4
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi,
    ich habe hier ein sehr gutes Beispiel gefunden zum up- und downloaden von Dateien eines FTP-Servers.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  5. #5
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Genau so mache ich es
     

  6. #6
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Ich würde mal vermuten, dass das ein oder andere mal die Datei einfach zu groß ist und dementsprechend nicht in der Zeit (DataTimeout) heruntergeladen werden kann.
    Das würde auch die nicht vorhandene Regelmäßigkeit erklären.
    Geändert von Fabio Hellmann (29.11.11 um 13:09 Uhr)
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  7. #7
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Die Dateien sind alle nicht größer als 15KB. Und es sind momentan ca 5 Stück dort.
    Also die Größe kann es glaub ich nicht sein.
     

  8. #8
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Könntest du deinen Code posten in dem du die FTP-Verbindung aufbaust, die Daten holst und die Verbindung wieder schließt?
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  9. #9
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    
    /**
         * Zum Server connecten
         * 
         * @param server
         * @return
         */
        private boolean connect()
        {
            ftpClient = new FTPClient();
     
            try
            {
                int reply;
                ftpClient.connect(SERVER_URL);
     
                // After connection attempt, you should check the reply code to verify success.
                reply = ftpClient.getReplyCode();
     
                if (!FTPReply.isPositiveCompletion(reply))
                {
                    ftpClient.disconnect();
                    ErrorDialog.show(new Exception("FTP server refused connection."));
                }
                else
                {
                    return true;
                }
            }
            catch (IOException e)
            {
                if (ftpClient.isConnected())
                {
                    try
                    {
                        ftpClient.disconnect();
                    }
                    catch (IOException f)
                    {
                        // do nothing
                    }
                }
     
                ErrorDialog.show(e);
            }
     
            return false;
        }

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
     /**
         * Am Server anmelden
         * 
         * @param username
         * @param password
         */
        private void login()
        {
            try
            {
                if (!ftpClient.login(SERVER_USER, SERVER_PSW))
                {
                    ftpClient.logout();
                    ErrorDialog.show(new Exception("Username/Password falsch!"));
                }
                else
                {
                    ftpClient.enterLocalPassiveMode();
                    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                    ftpClient.setConnectTimeout(20000);
                    ftpClient.setDataTimeout(20000);
                }
            }
            catch (IOException e)
            {
                ErrorDialog.show(e);
            }
        }

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    
        /**
         * Task damit des Abgleichen der Dateien im Hintergrund passiert
         *
         * @author MaRk
         */
        private class UpdateTask extends Task<Void,Void> implements FinishListener
        {
            private Queue<Task<Void, Void>> taskQueue;
            private FinishListener finishListener;
            
            public UpdateTask()
            {
                super(Application.getInstance());
                taskQueue = new LinkedBlockingQueue<Task<Void, Void>>();
            }
            
            public void addFinishListener(FinishListener finishListener)
            {
                this.finishListener = finishListener;
            }
            
            @Override
            protected Void doInBackground() throws Exception
            {
                try
                {
                    FTPFile[] serverFiles;
                    
                    if (ftpClient.isConnected())
                    {
                        serverFiles = ftpClient.listFiles(SERVER_DIR);
                    }
                    else
                    {
                        connect();
                        login();
                        serverFiles = ftpClient.listFiles(SERVER_DIR);
                    }
                    
                    File[] hostFiles = new File(HOME_DIR).listFiles();
     
                    List<String> uploadList = new ArrayList<String>();
                    List<String> downloadList = new ArrayList<String>();
     
                    // Listen befüllen
     
                    for (FTPFile file : serverFiles)
                    {
                        downloadList.add(file.getName());
                    }
     
                    for (File file : hostFiles)
                    {
                        uploadList.add(file.getName());
                    }
     
                    // Listen reduzieren um die schon vorhandenen Dateien
     
                    for (FTPFile file : serverFiles)
                    {
                        if (uploadList.contains(file.getName()))
                        {
                            uploadList.remove(file.getName());
                        }
                    }
     
                    for (File file : hostFiles)
                    {
                        if (downloadList.contains(file.getName()))
                        {
                            downloadList.remove(file.getName());
                        }
                    }
     
                    // Upload's + Download's zur Queue hinzufügen
     
                    for (String file : uploadList)
                    {
                        UploadTask uploadTask = new UploadTask(file);
                        uploadTask.addFinishListener(this);
                        taskQueue.add(uploadTask);
                    }
     
                    for (String file : downloadList)
                    {
                        
                        DownloadTask downloadTask = new DownloadTask(file);
                        downloadTask.addFinishListener(this);
                        taskQueue.add(downloadTask);
                    }
                    
                    // Queue starten
                    finished("");
                }
                catch (IOException e)
                {
                    ErrorDialog.show(e);
                }
                return null;
            }
     
            @Override
            public void finished(String threadName)
            {         
                Task<Void, Void> task;
                
                if( ( task = taskQueue.poll()) != null)
                {
                    task.execute();
                }
                else
                {
                    if (finishListener != null)
                    {
                        finishListener.finished("update");
                    }
                }
            }
            
            /**
             * Gibt die Anzahl der Task's zurück welche noch in der Queue sind.
             * @return
             */
            public int getQueueSize()
            {
                return taskQueue.size();
            }
        }

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    /**
         * Überprüft beide Verzeichnise(local + server) und gleicht diese ab.
         */
        public void update()
        {
            updateTask = new UpdateTask();
            updateTask.addFinishListener(this);
            updateTask.execute();
            updateFinished = false;
        }

    Die letzte Methode (update()) wird am Programmstart ausgeführt. Im Konstruktor wird connect() + login() aufgerufen.
    Der Fehler passiert bei:

    Code java:
    1
    2
    3
    4
    
    if (ftpClient.isConnected())
    {
         serverFiles = ftpClient.listFiles(SERVER_DIR);
    }
    Geändert von hesk (29.11.11 um 13:26 Uhr)
     

  10. #10
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Sonst noch jemand eine Idee?
     

  11. #11
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Hab jetzt das Programm verkleinert um zu überprüfen an was es liegt.
    Das Programm rennt 4 mal durch, dann kommt ein "time out". Dann gehts wieder 3x, dann wieder "time out".

    Der Server dürfte manchmal einfach nicht reagieren.
    Hat jemand eine Ahnung was man da am Server ändern kann?
     

  12. #12
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Hab mal bissal rum gelesen und denke das FTP keine so gute Idee zu Übertragung war.

    Werde mal http://www.jcraft.com/jsch/ probieren. Das basiert auf ssh.
     

  13. #13
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Mit jsch ging es problemlos.
     

Ähnliche Themen

  1. FTPClient.freeze()
    Von Unicate im Forum Java
    Antworten: 0
    Letzter Beitrag: 27.08.09, 18:51
  2. Antworten: 0
    Letzter Beitrag: 27.08.09, 15:15
  3. FTPClient Up- und download
    Von Steffen01 im Forum Java
    Antworten: 2
    Letzter Beitrag: 18.09.08, 20:50
  4. Antworten: 1
    Letzter Beitrag: 31.05.06, 14:02
  5. Kein zugang zum FTPclient
    Von patrickditter im Forum Hosting & Webserver
    Antworten: 2
    Letzter Beitrag: 18.08.04, 17:58