【问题标题】:detect lost connection of a Java FTP client检测 Java FTP 客户端的丢失连接
【发布时间】:2013-07-26 10:52:42
【问题描述】:

我正在使用 commons-net 中的 Java FTPClient 类从 ftp 服务器下载大文件。 如果我检测到某些连接失败,我希望文件从某个偏移量重新开始下载,例如:我的客户端连接断开或我的服务器关闭连接。 使用client.retrieveFile(filename, out),如果我在下载文件时关闭客户端连接,我不会收到任何异常,程序只是冻结在那里而无需下载或执行任何操作。如何触发此事件?我看到一个 FTPConnectionClosedException,但它只在服务器关闭我的连接时调用。

【问题讨论】:

    标签: java ftp apache-commons-net


    【解决方案1】:

    您可以保留某种序列 ID,它可以表示已下载了多少数据,并在您合法完成后将其设置为某个特殊值。

    sequence=0;
    try{
    while(notDone){
       n = client.retrieveFile(filename, out); //bytes read
       sequence =+ n;
    }finally{
    if(sequence != SPECIAL_VALUE){
        throw new customException();
        }
    }
    

    最终您的代码将执行 finally 块,您可以决定如何处理它。或者,如果您想要更多 fail fast 解决方案,您可以通过测量 sequence 上次更新的时间来使用超时。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您可以在下载过程中定期以并行方式调用ftpClient.getState()。如果连接消失,它会抛出 SocketTimeoutException。此外,之前您需要通过 ftp.setControlKeepAliveTimeout(5) 设置超时(例如 5 秒)

      这是示例:

      ftpClient.setControlKeepAliveTimeout(5);
      Callable<Boolean> downloadTask = () -> {
          try {
              return ftpClient.retrieveFile(name, counterOutput);
          } catch (IOException e) {
              Logger.error(e.getMessage(), e);
              return false;
          }
      };
      Callable<Boolean> connectionCheckTask = () -> {
          try {
              while(true) {
                  Thread.sleep(5000);
                  ftpClient.getStatus();
              }
          } catch (SocketTimeoutException e) {
              Logger.error("Connection is broken", e);
              return false;
          } catch (InterruptedException e) {
              Logger.error(ex.getMessage, e);
              return false;
          }
      };
      ExecutorService execSvc = Executors.newCachedThreadPool();
      Boolean result = execSvc.invokeAny(Arrays.asList(downloadTask, connectionCheckTask));
      execSvc.shutdown();
      

      我认为这不是完美的解决方案,但它对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-25
        • 2022-01-06
        • 2013-07-01
        • 2011-05-30
        相关资源
        最近更新 更多