java--ftp获取文件列表时卡死/无反应/程序无异常,问题解决

1起初有一个应用,在经典网络服务器A,拉取ftp文件的,运行正常,然后A服务器 马上就要过期了,因公司管理需要,需要新申请vpc网络服务器B,然后我开始着手应用迁移的工作

然后问题就出现了,应用迁移至新的服务器B之后, 程序执行到

FTPFile[] ftpFiles = ftpClient.listFiles(); 时 后续就没有任何响应了 也没有报错

经过请教得到解决问题方法如下 

1在服务器B执行linux命令连接ftp尝试网络连接是否正常   ftp ftp.***.com 登录用户名 和密码

使用ls 命令发现是可以获取文件列表的 ,如果出现错误 说明新服务器未被ftp服务器允许白名单  排除此问题

2在服务器B 程序未执行之前 先在服务器B执行 监控网络和端口的命令  tcpdump port 21 -X     //21为ftp的端口

此时进入监控状态,开始启动程序 

java--ftp获取文件列表时卡死/无反应/程序无异常,问题解决

下面后陆续出现 初始化连接ftp的 一些数据  然后执行到获取列表时出现了一下错误

java--ftp获取文件列表时卡死/无反应/程序无异常,问题解决

意思为获取 ACC文件夹列表失败  此时问题找到,

如何解决呢 我们再打开一个lunix窗口

连接到ftp 执行 登录后 执行 ls命令获取列表  ,此时返回前一个 监控端口的窗口 发现信息如下

java--ftp获取文件列表时卡死/无反应/程序无异常,问题解决

PASV 切换到了被动模式后可以获取成功

ftp-主动模式(PORT)和被动模式(PASV)

看了代码 没有设置主动或被动模式  然后加上代码后

java--ftp获取文件列表时卡死/无反应/程序无异常,问题解决

增加以下代码

ftpClient.enterLocalPassiveMode();

再次启动服务器B的应用 成功获取文件列表,程序执行正常

至于主动模式和被动模式的区别在这里就不阐述了,有兴趣了解的可以百度资料