Hallo
Ich verwende die Klasse FTPClient von Commons Net (3.0.1) für FTP-Dateitransfer.
commons.apache.org
Das funktioniert gut, solange die Verbindung schnell genug ist, z.B. 150 kbit/s und mehr. Mit einer Modem-Verbindung von 56 kbit/s kann ich mit dem FTP-Server in Verbindung treten und die Dateiliste abrufen, aber es treten 3 Fehlerzustände auf (Stack-Traces siehe unten):
- Nach dem Hinaufladen einer Datei zum Server gibt es ein Read Timeout (die Datei ist aber vollständig angekommen)
- Herunterladen einer Datei (auch nur 1 kByte) ist nicht möglich
- Beim Logout gibt es wieder ein Read Timeout
Andere FTP-Programme kommen mit einer Modem-Verbindung problemlos klar (WS-FTP etc.).
Möglicherweise könnte eine passende Einstellung der verschiedenen Timeouts das Problem lösen. Leider bin ich kein Spezialist in FTP oder Netzwerk-Verbindungen im Allgemeinen. Die derzeitigen Einstellungen sind:
PS:
Ich habe bereits auf Commons Net gepostet, aber außer einer Rückfrage kam nichts.
1. Datei zum Server hinaufladen
Zeile 590 input = new FileInputStream(pathFilename);
Zeile 591 result = ftpC.storeFile(serverFilename, input);
Mit der Zeile 591 wird eine Ausnahme geworfen und mit diesem catch-Block abgefangen:
catch(SocketTimeoutException ste) {
text1 = ste.getMessage();
text2 = ste.getCause();
ste.printStackTrace();
}
text1 = Read timed out
text2 = null
printStackTrace():
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.read(Unknown Source)
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.getReply(FTP.java:632)
at org.apache.commons.net.ftp.FTPClient.completePendingCommand(FTPClient.java:1561)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:581)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1704)
at InternetServer.putServerFiles(InternetServer.java:591)
2. Datei vom Server herunterladen:
Zeile 510 output = new FileOutputStream(pathFilename);
Zeile 511 result = ftpC.retrieveFile(serverFilename, output);
Die Methode retrieveFile() liefert "false" zurück, es wird jedoch keine Ausnahme geworfen.
3. Ausloggen vom Server
Zeile 218 ftpC.logout();
Mit der Zeile 218 wird eine Ausnahme geworfen und mit diesem catch-Block abgefangen:
catch(IOException ioe) {
ioe.printStackTrace();
}
printStackTrace():
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.read(Unknown Source)
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:474)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:547)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:596)
at org.apache.commons.net.ftp.FTP.quit(FTP.java:804)
at org.apache.commons.net.ftp.FTPClient.logout(FTPClient.java:941)
at InternetServer.ftp(InternetServer.java:218)
Ich verwende die Klasse FTPClient von Commons Net (3.0.1) für FTP-Dateitransfer.
commons.apache.org
Das funktioniert gut, solange die Verbindung schnell genug ist, z.B. 150 kbit/s und mehr. Mit einer Modem-Verbindung von 56 kbit/s kann ich mit dem FTP-Server in Verbindung treten und die Dateiliste abrufen, aber es treten 3 Fehlerzustände auf (Stack-Traces siehe unten):
- Nach dem Hinaufladen einer Datei zum Server gibt es ein Read Timeout (die Datei ist aber vollständig angekommen)
- Herunterladen einer Datei (auch nur 1 kByte) ist nicht möglich
- Beim Logout gibt es wieder ein Read Timeout
Andere FTP-Programme kommen mit einer Modem-Verbindung problemlos klar (WS-FTP etc.).
Möglicherweise könnte eine passende Einstellung der verschiedenen Timeouts das Problem lösen. Leider bin ich kein Spezialist in FTP oder Netzwerk-Verbindungen im Allgemeinen. Die derzeitigen Einstellungen sind:
- DefaultTimeout = 0 (default)
- SocketTimeout = 0 (default)
- ConnectTimeout = 0 (default)
- ControlKeepAliveTimeout = 300 seconds, entsprechend dem Beispiel in der API
- ControlKeepAliveReplyTimeout = 1000 milliseconds (default)
PS:
Ich habe bereits auf Commons Net gepostet, aber außer einer Rückfrage kam nichts.
1. Datei zum Server hinaufladen
Zeile 590 input = new FileInputStream(pathFilename);
Zeile 591 result = ftpC.storeFile(serverFilename, input);
Mit der Zeile 591 wird eine Ausnahme geworfen und mit diesem catch-Block abgefangen:
catch(SocketTimeoutException ste) {
text1 = ste.getMessage();
text2 = ste.getCause();
ste.printStackTrace();
}
text1 = Read timed out
text2 = null
printStackTrace():
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.read(Unknown Source)
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.getReply(FTP.java:632)
at org.apache.commons.net.ftp.FTPClient.completePendingCommand(FTPClient.java:1561)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:581)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1704)
at InternetServer.putServerFiles(InternetServer.java:591)
2. Datei vom Server herunterladen:
Zeile 510 output = new FileOutputStream(pathFilename);
Zeile 511 result = ftpC.retrieveFile(serverFilename, output);
Die Methode retrieveFile() liefert "false" zurück, es wird jedoch keine Ausnahme geworfen.
3. Ausloggen vom Server
Zeile 218 ftpC.logout();
Mit der Zeile 218 wird eine Ausnahme geworfen und mit diesem catch-Block abgefangen:
catch(IOException ioe) {
ioe.printStackTrace();
}
printStackTrace():
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.read(Unknown Source)
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:474)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:547)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:596)
at org.apache.commons.net.ftp.FTP.quit(FTP.java:804)
at org.apache.commons.net.ftp.FTPClient.logout(FTPClient.java:941)
at InternetServer.ftp(InternetServer.java:218)