首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >上传文件后ftp4j读取超时

上传文件后ftp4j读取超时
EN

Stack Overflow用户
提问于 2015-03-20 16:54:40
回答 1查看 2.7K关注 0票数 3

在文件上传过程中(使用ftp4j库),我从一个特定的工作站收到一个奇怪的异常。

文件上传后(100%),我会收到一个读取超时异常。下面是:

代码语言:javascript
复制
2015-03-20 18:14:43 INFO  TranferFileFtp4j:760 - FTP Server supports resume. Trying to upload file
2015-03-20 18:14:43 INFO  Ftp4jListener:38 - TRANSFER-STATUS: File transfer started
2015-03-20 18:14:43 INFO  Ftp4jListener:47 - File: 152818571.zip | Bytes transfered 65536 Percentage: 0.024173772%
...
2015-03-20 18:20:08 INFO  Ftp4jListener:47 - File: 153740599.zip | Bytes transfered 244383744 Percentage: 99.89077%
2015-03-20 18:20:08 INFO  Ftp4jListener:47 - File: 153740599.zip | Bytes transfered 244449280 Percentage: 99.91756%
2015-03-20 18:20:08 INFO  Ftp4jListener:47 - File: 153740599.zip | Bytes transfered 244514816 Percentage: 99.94434%
2015-03-20 18:20:08 INFO  Ftp4jListener:47 - File: 153740599.zip | Bytes transfered 244580352 Percentage: 99.97113%
2015-03-20 18:20:08 INFO  Ftp4jListener:47 - File: 153740599.zip | Bytes transfered 244645888 Percentage: 99.99792%
2015-03-20 18:20:08 INFO  Ftp4jListener:47 - File: 153740599.zip | Bytes transfered 244650979 Percentage: 100.0%
2015-03-20 18:20:18 INFO  TranferFileFtp4j:803 - Failed to send File! IOException other exceptionRead timed out - null
java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.security.ssl.InputRecord.readFully(Unknown Source)
    at sun.security.ssl.InputRecord.read(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
    at sun.security.ssl.AppInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.read0(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at it.sauronsoftware.ftp4j.NVTASCIIReader.readLine(NVTASCIIReader.java:105)
    at it.sauronsoftware.ftp4j.FTPCommunicationChannel.read(FTPCommunicationChannel.java:142)
    at it.sauronsoftware.ftp4j.FTPCommunicationChannel.readFTPReply(FTPCommunicationChannel.java:187)
    at it.sauronsoftware.ftp4j.FTPClient.upload(FTPClient.java:2797)
    at it.sauronsoftware.ftp4j.FTPClient.upload(FTPClient.java:2586)
    at com.npap.network.TranferFileFtp4j.uploadFileFtps5(TranferFileFtp4j.java:765)
    at com.npap.utils.ProcessDicomFiles.sendZippFiles(ProcessDicomFiles.java:215)
    at com.npap.scheduler.MainJob.execute(MainJob.java:97)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
    java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.security.ssl.InputRecord.readFully(Unknown Source)
    at sun.security.ssl.InputRecord.read(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
    at sun.security.ssl.AppInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.read0(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at it.sauronsoftware.ftp4j.NVTASCIIReader.readLine(NVTASCIIReader.java:105)
    at it.sauronsoftware.ftp4j.FTPCommunicationChannel.read(FTPCommunicationChannel.java:142)
    at it.sauronsoftware.ftp4j.FTPCommunicationChannel.readFTPReply(FTPCommunicationChannel.java:187)
    at it.sauronsoftware.ftp4j.FTPClient.disconnect(FTPClient.java:1133)
    at com.npap.network.TranferFileFtp4j.uploadFileFtps5(TranferFileFtp4j.java:826)
    at com.npap.utils.ProcessDicomFiles.sendZippFiles(ProcessDicomFiles.java:215)
    at com.npap.scheduler.MainJob.execute(MainJob.java:97)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)

这是密码:

代码语言:javascript
复制
ftpClient = Ftp4jUtility.ftpsConnect(SERVER_MACHINE, PORT, SERVER_USERNAME, SERVER_PASSWORD, stdId);
ftpClient.changeDirectory(config.getFtpRemoteFolderUploads());

 if(ftpClient.isResumeSupported()) {
     ftpClient.upload(localFile, writtenBytes, new Ftp4jListener(localFile.length(), localFile.getName()));
 } else {
     ftpClient.upload(localFile, new Ftp4jListener(localFile.length(), localFile.getName()));
 }

completed = true;

} catch (FTPAbortedException e) {
    ....
    break;
} catch (FTPDataTransferException ex1) {
    studyDetailsDAO.updateStudyIsInProgress(stdId, false);
    ex1.printStackTrace();
    ....
} catch (FTPException ex1) {
   ex1.printStackTrace();
   ....
} catch (FTPIllegalReplyException ex1) {
   ex1.printStackTrace();
   ...
} catch (IOException ex1) {
   log.info("Failed to send File! IOException " + ex1.getMessage());
   ex1.printStackTrace();
} catch (IllegalStateException ex1) {
   ...
} finally {
   if(ftpClient!=null && ftpClient.isConnected()) {
       try {
           ftpClient.disconnect(true); 
       } catch (Throwable t) {
           t.printStackTrace();
       }
   }
}

我收到了这个异常: IOException -读超时!有什么原因吗?或者如何继续进行调试?

奇怪的是,所有的ftp操作都在工作!我也可以开始和实际上传文件,但在结束的ftpClient.upload操作,我收到这一次!

我还检查并发现,我有这个特殊的问题,从一个特定的工作站。我甚至尝试使用filezilla上传一个文件,我也收到了类似的异常(读取超时)。所以我想这是网络或防火墙的问题..。有什么想法吗?

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-29 19:27:48

可能问题

FTP协议在客户端和服务器之间使用单独的控制和数据TCP连接。在文件传输期间,数据连接是繁忙的,但控制连接是空闲的。根据您的日志,转移需要15分钟。这意味着控制连接在这段时间内处于空闲状态。有些防火墙或网络路由器可以在一段时间内不进行任何活动而断开连接。看起来是这样的,因为readFTPReply试图从控件连接读取并抛出"Read“。

如何调试

您可以通过Wiresharktcpdump在客户端对通信量进行转储,并试图找出控件连接断开的原因。

如何修复

我可以看到解决这个问题的两种方法:

  1. 您可以将服务器通过控制连接发送NOOP命令,以便在传输过程中进行一些活动,并在防火墙/路由器中重置连接的空闲计时器。我不确定ftp4j是否能做到这一点。但是您可以切换到Apache FTPClient并使用setControlKeepAliveTimeout
  2. 您可以尝试更新/更改防火墙/路由器。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29171880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档