Robię pobieranie pliku ftp z serwera przy pomocy biblioteki Apache (commons.net ver 3.2). Pobieranie było w porządku i otrzymałem wszystkie potrzebne pliki i zapisałem je w folderze. Problem, który mam z limitami czasu, ponieważ gdy połączenie jest przerwane podczas pobierania, potrzebuję komunikatu o błędzie, który pokazuje, że połączenie zostało utracone, ale znalazłem trudności w wykonaniu tego, przeszukałem niezliczone fora, w tym jeden i próbowałem na wiele sposobów, aby rozwiązać ten problem, ale nikt jeszcze nie osiągnął wyniku! Kod, który mam jest następujący:Problemy z czasem oczekiwania ftp na apache'a
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);
}
}
Próbowałem wszystkie rzeczy, jakie mogły znaleźć Przeczytałem, że setdefaulttimeout służy do aktywacji wszystkie limity czasu, connectiontiomeout służy do oczekiwania na połączenia i getsotimeouts służy kiedy ładujemy plik, ale to nie działa, próbowałem dać mu 5 sekund, żeby nie pobierał pliku, ale to nie działa, czytałem, że są pewne problemy z rozłącznym czasem połączenia i że powinniśmy używać socketfactory, więc też założyłem fabrykę gniazdek i próbowałem, ale to nie zadziałało i osiągnąłem punkt, w którym jestem trochę rozpaczliwy, więc proszę o pomoc, tak bardzo się starałem client.setControlKeepAliveTimeout(10000);
ustalić czas życia, ale to nie zadziałało! :(
Parametr 'setControlKeepAliveTimeout' jest w sekundach. –