今日项目中使用Apache的FtpsClient制作ftp下载工具时发现,在做了NAT地址转换的情况下,使用被动模式,可以连接ftp服务器,但是在下载文件时超时
例:
ftp server 转换前ip为hostA,转换后ip为hostB
ftpsClient.setConnectTimeout(50000); ftpsClient.setDataTimeout(50000); //设置默认编码 ftpsClient.setControlEncoding(DEFAULT_REMOTE_CHARSET); //设置默认端口 ftpsClient.setDefaultPort(DEFAULT_REMOTE_PORT); //设置是否显示隐藏文件 ftpsClient.setListHiddenFiles(false); ftpsClient.connect(**hostB**, Integer.parseInt(port)); ftpsClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 设置被动模式 ftpsClient.enterLocalPassiveMode();
此时连接时没有问题的,但是在下载文件时会报错
ftpsClient.retrieveFile(remoteFilePath, outputStream)
后来发现在下载文件时ip变为了hostA
解决方案
ftpsClient.setPassiveNatWorkaroundStrategy((hostname -> {
return hostB;
}));



