2011-04-11 2 views

Répondre

0

Je viens d'implémenter une sorte de code suivant. J'ai découvert que Si vous utilisez les flux compressés, vous ne pouvez pas compter sur les octets transférés signalés par l'écouteur, car le serveur peut attendre d'autres données pour décoder les blocs reçus précédemment.

Même si les flux sont des plaines, dans certains cas de perte de connexion, vous ne pouvez toujours pas compter sur le nombre total d'octets transférés tel que rapporté par l'auditeur. Donc, j'ai finalement réalisé que le meilleur moyen est de demander au serveur combien d'octets il a reçu.

Dans mon modèle, la redondance temporelle est plus générale et implique la connexion de contrôle avec le serveur FTP. Vous pouvez limiter la boucle while à la connexion de données, c'est-à-dire le téléchargement.

FTPClient ftpClient = null; 
long writtenBytes; 
boolean isCompletedStartingDelete = false; // Our policy is overwrite at first 
for (int attempt = 0; attempt < MAX_ATTEMPTS; attempt++) { 
    try { 
     ftpClient = getFTPClient(); 
     configureFtpClient(ftpClient); 
     doLogin(ftpClient); 
     ftpClient.changeDirectory(remoteDirectory); 

     if (!isCompletedStartingDelete) { // Our policy is overwrite at first 
     try { 
      ftpClient.deleteFile(file); 
      isCompletedStartingDelete = true; 
     } catch (FTPException e) { 
      // Maybe you should check if this exception is really thrown for file not existing. 
      isCompletedStartingDelete = true; 
     } 
     } 

     try { 
     writtenBytes = ftpClient.fileSize(fileName); 
     } catch (Exception e) { 
     writtenBytes = 0; 
     } 

     if (ftpClient.isResumeSupported()) { 
     // With this template you also could use APPEND 
     ftpClient.upload(file, writtenBytes, listener); 
     } else { 
     ftpClient.upload(file, listener); 
     } 
    } catch (FTPAbortException e) { 
     // User Aborted operation 
     break; 
    } catch (Exception e) { 
     if (attempt == MAX_ATTEMPTS) { // Or in general lastLoop 
     throw e; 
     } else { 
     // Mask failure 
     // LOG 
     } 
    } finally { 
     if (ftpClient != null && ftpClient.isConnected()) { 
     try { ftpClient.disconnect(); } catch (Throwable t) { /* LOG */ } 
    } 
} 

Questions connexes