我使用的是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个),我不知道我是否很不幸在我的本地开发机上没有发生错误,或者我的承包商与远程服务器之间的通信实际上有问题吗?
答案 0 :(得分:0)
每次使用FTP进行文件传输或目录列表时,服务器(或客户端,如果使用活动模式)都会为该传输分配超出配置范围的随机端口号。传输完成后,端口号不会立即释放。有一些 cooldown 间隔。如果在短时间间隔内进行太多文件传输,则服务器可能会耗尽可用端口–因为所有端口最终都处于冷却状态。
如果可以,请检查服务器配置并配置更大范围的端口。
或者,作为解决方法,您可以尝试降低传输速率。
有关某些背景,请参见:
尽管这只是一个猜测,但您应该检查服务器的日志,因为它可以显示更多详细信息。
另一种可能性是,在一定的时间间隔内,服务器只允许特定用户或源地址进行有限次数的传输。