上载文件后ftp4j读取超时

坦尼利

从特定工作站上载文件(使用ftp4j库)期间,我收到一个奇怪的异常。

文件上载后(100%),我收到读取超时异常。这里是:

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)

这是代码:

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上传文件,并且收到类似的异常(读取超时)。所以我想这是网络或防火墙问题...有什么想法吗?

有任何想法吗?

瓦迪姆

可能的问题

FTP协议在客户端和服务器之间使用单独的控制和数据TCP连接。在文件传输期间,数据连接正忙,但控制连接处于空闲状态。根据您的日志,传输需要15分钟。这意味着控制连接在该时间段内处于空闲状态。某些防火墙或网络路由器可以在一定时间内无任何活动地断开连接。似乎是这种情况,因为readFTPReply尝试从控件连接读取并抛出“读取超时”

如何调试

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

怎么修

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

  1. 您可以NOOP在控制连接上ping服务器发送命令,以在传输期间进行一些活动,并在防火墙/路由器中重置连接的空闲计时器。我不确定ftp4j是否可以做到这一点。但是您可以切换到Apache FTPClient并使用setControlKeepAliveTimeout

  2. 您可以尝试更新/更改防火墙/路由器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Error connecting to FTP server using ftp4j in android

来自分类Dev

在Android中使用ftp4j连接到FTP服务器时出错

来自分类Dev

在FTP服务器的特定路径上载文件

来自分类Dev

如何按角度读取上载文件的内容?

来自分类Dev

上载文件烦人错误

来自分类Dev

设置用户通过FTP上载文件的默认所有者

来自分类Dev

上载文件后,套接字服务器抛出“套接字已关闭”

来自分类Dev

从文件系统提供上载文件的问题

来自分类Dev

通过ajax上载多个文件,多次上载文件

来自分类Dev

上载文件不适用于mp3和mp4

来自分类Dev

如何从手机上载文件并将其作为FormData Ionic 4发送

来自分类Dev

使用FormData和multer上载文件

来自分类Dev

KendoUI上载文件数据属性

来自分类Dev

上载文件时/ upload /的Django SuspiciousOperation

来自分类Dev

在另一页上载文件

来自分类Dev

在Shell Runner中卷曲上载文件

来自分类Dev

上载文件并使用summarytools闪亮

来自分类Dev

上载文件时显示进度栏

来自分类Dev

上载文件时内存不足

来自分类Dev

如何从IOwinRequest获取上载文件的集合?

来自分类Dev

使用PostAsync从HTML表单上载文件

来自分类Dev

Node.js上载文件的位置

来自分类Dev

上载文件,避免使用HTTP OPTIONS

来自分类Dev

TransferManager上载实际上并未上载文件

来自分类Dev

从S3下载文件> 3Gb失败,并显示“ SocketTimeoutException:读取超时”

来自分类Dev

可以从FTP下载文件

来自分类Dev

使用ftp下载文件

来自分类Dev

无法从 FTP 下载文件

来自分类Dev

PHP上载文件未保存到上载文件夹