2013-04-08 25 views
5

Sto scaricando un file ftp da un server con l'aiuto di una libreria Apache (commons.net ver 3.2). Il download è andato bene e ho ricevuto tutto il file di cui avevo bisogno e li ho salvati in una cartella. Il problema che ho è con i timeouts perché quando la connessione viene interrotta mentre sto scaricando ho bisogno di un messaggio di errore che mi mostra che la connessione è stata persa, ma ho trovato difficoltà a fare questo, ho cercato innumerevoli forum tra cui questo uno e ho provato molti modi per risolvere questo, ma nessuno ha ancora il risultato! Il codice che ho è il seguente:Problemi con timeout client ftp apache commons

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); 
    } 
} 

Ho provato tutte le cose che un riusciva a trovare un letto che il setdefaulttimeout viene utilizzato per attivare tutti i timeout, connectiontiomeout viene utilizzata per attendere le connessioni e getsotimeouts viene utilizzato quando stiamo scaricando un file ma non funziona ho provato a darlo 5 secondi in modo che non scarichi il file ma non funziona, ho letto che ci sono alcuni problemi con i tempi di connessione e che dovremmo usare socketfactory, così ho creato una fabbrica di prese e ho provato ma non ha funzionato e ho raggiunto un punto in cui sono un po 'disperato, quindi ti sto chiedendo un aiuto che ho provato così tanto client.setControlKeepAliveTimeout(10000); per stabilire un timeout attivo ma non ha funzionato! :(

+0

Il parametro di 'setControlKeepAliveTimeout' è espresso in secondi. –

risposta

0

C'è qualche motivo per cui stai riconnessione al server con un URLConnection dopo aver già collegato con la FTPClient?

FTPClient ha il metodo retrieveFileStream. Questo sarà un'eccezione se si verifica un errore durante la elaborazione

Problemi correlati