【问题标题】:After retrieving multiple files I get an error on the next file '425 can't open data connection for transfer of file'检索多个文件后,下一个文件出现错误“425 无法打开数据连接以传输文件”
【发布时间】:2019-06-07 07:34:10
【问题描述】:

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

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

下载随机数量的文件后,我在下一个文件上调用retrieveFileStream 时卡住了,没有超时或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 个)我的承包商与远程服务器的通信实际上有问题吗?

【问题讨论】:

  • 在远程服务器上的传输速度不是比在本地开发机器上更快吗(例如,因为连接速度更快)?
  • 几乎可以肯定。我只有一台笔记本电脑。并且进程部署在高端机器上,可能和FTP服务器在同一个主机中心。

标签: java file-io ftp


【解决方案1】:

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

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

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

有关一些背景,请参阅:


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

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

【讨论】:

  • 我发布的日志是来自 FTP 服务器的日志。该方法本身不会抛出超时或 I/O 异常,因为这个问题是非常有问题的。由于整个过程是每十分钟启动一次的 CRON,因此我在服务器上有很多线程被卡住了。但港口的事情可能是正确的。我会联系他们的管理员,谢谢你的提示:)
  • 我的意思是一些更详细的日志来解释为什么它“无法打开数据连接”
猜你喜欢
  • 2012-03-12
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多