检索多个文件后,下一个文件出现错误“ 425无法打开数据连接进行文件传输”

时间:2019-06-07 07:34:10

标签: java file-io ftp

我使用的是apache commons-net FTPClient(版本3.3),并且在我的一台客户端计算机上产生了以下错误(我尝试在测试计算机上使用相同的请求在测试文件夹中重现错误,但运气不佳具有相同登录名的同一服务器)

我有一个过程可以检查远程FTP服务器是否有XML文件形式的新请求。列出所有这些文件之后,我将循环检查它们是否为XML格式。如果文件是这种格式,我首先通过将格式从* .xml更改为* .xmlProcessing来更改其名称,将它们检索到输入流,将它们解析为我的对象,并在队列中创建一个请求,最后更改名称并将它们移到作为存档的子文件夹中。

下载了随机数量的文件后,我在调用下一个文件的retireFileStream时卡住了,没有超时或IO异常。

我设法从FTP服务器获取日志,它只是说它无法打开数据连接

05.06.2019 12:45:45 -  > RNFR /folder/file.xml

05.06.2019 12:45:45 -  > 350 File exists, ready for destination name.

05.06.2019 12:45:45 -  > RNTO /folder/file.xmlProcessing

05.06.2019 12:45:45 -  > 250 file renamed successfully

05.06.2019 12:45:45 -  > PORT *ports*

05.06.2019 12:45:45 -  > 200 Port command successful

05.06.2019 12:45:45 -  > RETR /folder/file.xmlProcessing

05.06.2019 12:45:45 -  > 150 Opening data channel for file download from server of "/folder/file.xmlProcessing"

05.06.2019 12:45:45 -  > 425 Can't open data connection for transfer of "/folder/file.xmlProcessing"

我已经尝试过不同的FTP模式。主动本地,远程,被动等(当前卡在被动本地模式下)。

我已经尝试了数据超时,但是尽管我最终将超时设置为30秒,但是当我终于卡在其中一个文件上时,该方法仍在该文件上花费了1分钟以上。

ftp = new FTPClient();
ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
ftp.connect(server, port);
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
    ftp.disconnect();
    throw new IOException("Exception in connecting to FTP Server");
}
ftp.login(user, password);
ftp.enterLocalPassiveMode();
ftp.setKeepAlive(true);
ftp.setDataTimeout(30000);
Collection<String> listOfFiles = listFiles(FOLDER_PATH);
for(String filePath : listOfFiles){
  if (filePath != null && filePath.endsWith(".xml")) {
     ftp.rnfr(folder + filePath);
     ftp.rnto(folder + filePath + "Processing");
     InputStream fileInputStream = ftp.retrieveFileStream(folder + filePath + "Processing");
     ftp.completePendingCommand();
     //Parsing file to an instance of my object and creating request
     ftp.rnfr(folder + filePath + "Processing");
     ftp.rnto(archiveFolder + filePath);
     if(fileInputStream != null){
    fileInputStream.close();
     }
  }
}

是否更有可能是FTP服务器的故障,防火墙问题或其他原因?

我已经在我的开发机上运行了相同的代码,并且它处理了测试文件夹中的所有文件(其中大约有400个),我不知道我是否很不幸在我的本地开发机上没有发生错误,或者我的承包商与远程服务器之间的通信实际上有问题吗?

1 个答案:

答案 0 :(得分:0)

每次使用FTP进行文件传输或目录列表时,服务器(或客户端,如果使用活动模式)都会为该传输分配超出配置范围的随机端口号。传输完成后,端口号不会立即释放。有一些 cooldown 间隔。如果在短时间间隔内进行太多文件传输,则服务器可能会耗尽可用端口–因为所有端口最终都处于冷却状态。

如果可以,请检查服务器配置并配置更大范围的端口。

或者,作为解决方法,您可以尝试降低传输速率。

有关某些背景,请参见:


尽管这只是一个猜测,但您应该检查服务器的日志,因为它可以显示更多详细信息。

另一种可能性是,在一定的时间间隔内,服务器只允许特定用户或源地址进行有限次数的传输。