Ich mache einen FTP-Download von einem Server mit Hilfe von einer Apache-Bibliothek (commons.net ver 3.2). Der Download war in Ordnung, und ich erhielt alle benötigten Dateien und speicherte sie in einem Ordner. Das Problem, das ich habe, ist mit den Zeitüberschreitungen, denn wenn die Verbindung unterbrochen wird, während ich lade, brauche ich eine Fehlermeldung, die mir zeigt, dass die Verbindung verloren gegangen ist, aber ich habe Schwierigkeiten dabei gefunden, ich habe unzählige Foren einschließlich dieses durchsucht Einer und ich habe viele Möglichkeiten versucht, dies zu lösen, aber niemand hat noch ein Ergebnis! Der Code, den ich habe, ist wie folgt:Probleme mit Apache Commons FTP-Client-Timeout
public void doSomething(String ip, int port, String user, String pass, String server, String remotePath, String localPath) {
int tenseconds = 10 * 1000;
int thirtyseconds = 30 * 3000;
Socket s4 = new Socket();
java.net.InetSocketAddress adr = new java.net.InetSocketAddress("213.0.17.234", 21);
s4.connect(adr, thirtyseconds);
FTPClient client = new FTPClient();
org.apache.commons.vfs2.FileSystemOptions fileSystemOptions = null;
String key = FtpFileSystemConfigBuilder.getInstance().getEntryParser(fileSystemOptions);
try {
client.setConnectTimeout(tenseconds);
client.setDefaultTimeout(thirtyseconds);
client.connect(ip, port);
client.setSoTimeout(thirtyseconds);
int reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
throw new FileSystemException("vfs.provider.ftp/connect-rejected.error");
}
client.enterLocalPassiveMode();
boolean login = client.login(user, pass);
URL url = new URL("ftp://" + user + ":" + pass + "@" + server + remotePath + ";type=i");
URLConnection urlc = url.openConnection();
urlc.setConnectTimeout(1000);
InputStream is = urlc.getInputStream();
BufferedWriter bw = new BufferedWriter(new FileWriter(localPath));
int c;
client.setSoTimeout(tenseconds);
client.setControlKeepAliveTimeout(10000);
while ((c = is.read()) != -1) {
urlc.getConnectTimeout();
bw.write(c);
}
long t2 = System.currentTimeMillis();
System.out.println(t2);
JOptionPane.showMessageDialog(null, "se cargo el primer fichero!", "información", JOptionPane.INFORMATION_MESSAGE);
if (login) {
FTPFile[] files = client.listFiles();
for (FTPFile file : files) {
if (file.getType() == FTPFile.DIRECTORY_TYPE) {
System.out.println("ftp file: " + file.getName() + ";" + FileUtils.byteCountToDisplaySize(file.getSize()));
} else if (file.getType() == FTPFile.FILE_TYPE) {
System.out.println("ftp file: " + file.getName() + ";" + FileUtils.byteCountToDisplaySize(file.getSize()));
}
}
is.close();
bw.close();
client.setSoTimeout(tenseconds);
client.logout();
client.disconnect();
}
} catch (IOException e) {
StringWriter sw0 = new StringWriter();
PrintWriter p0 = new PrintWriter(sw0, true);
e.printStackTrace(p0);
System.out.println("connection probably lost");
JOptionPane.showMessageDialog(null, "Error: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}
ich versucht habe, alle Dinge, die ein ein gelesen haben gefunden, dass die setDefaultTimeout alle Timeouts aktivieren verwendet wird, connectiontiomeout verwendet wird für Verbindungen und getsotimeouts zu warten, wird verwendet, Wenn wir eine Datei downdoaden, aber es funktioniert nicht Ich habe versucht, es 5 Sekunden zu geben, damit es die Datei nicht herunterladen wird, aber es funktioniert nicht, ich habe gelesen, dass es einige Probleme mit Verbindungstimeouts gibt und dass wir suffacefactory verwenden sollten. Also habe ich auch eine Socket-Factory erstellt und ich habe es versucht, aber es hat nicht funktioniert und ich habe einen Punkt erreicht, an dem ich ein bisschen verzweifelt bin. Also bitte ich dich um Hilfe, also versuche ich client.setControlKeepAliveTimeout(10000);
ein Timeout einzurichten, aber es hat nicht funktioniert! :(
Der Parameter 'setControlKeepAliveTimeout' ist in Sekunden angegeben. –