• FTP 调用 FTPClient.listFiles()或者FTPClient.retrieveFile()方法卡住了,咋解决(亲测有效)


    1 解决

    【解决办法】
    调用 FTPClient.listFiles()或者FTPClient.retrieveFile()方法前,先调用一下FTPClient.enterLocalPassiveMode()

    记住一定是两行代码中间不能有其他代码;

    格式就下面的,两行代码中间不能有其他的代码

    【测试范例】
    示例1:
    ftpClient.enterLocalPassiveMode();
    FTPFile[] fs = ftpClient.listFiles();
    示例2:
    
    ftpClient.enterLocalPassiveMode();
    InputStream ins = ftpClient.retrieveFileStream(remotefilePath);
    示例3:
    
    ftpClient.enterLocalPassiveMode();
    InputStream ins = ftpClient.retrieveFile(remotefilePath, outputStream);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    【问题扩展】
    如果你的程序在自己电脑上可以正常下载FTP文件,但是上线后确不可以了,下载文件假死,请核查是不是生产环境服务器的防火墙没有关闭。
    如果有特殊原因,生产环境服务器防火墙要开着,那建议在写Java代码读取文件时,用上FTPClient.enterLocalPassiveMode()。

    2 原因

    FTP有两种模式:主动模式(active mode)和被动模式(passive mode)

    默认情况下是启动的主动模式。

    FTP是TCP链接,所以在读取文件时,要进行三次握手。

    我这里在进行调试的时候,FTP Server的防火墙是关闭的,但是服务器Tomcat是在我本地PC跑的,防火墙是开启的,即FTP Client开防火墙了。

    当FTP使用主动模式时,在三次握手后,FTP Client会开启一个>1024的端口,FTP Server会开启默认端口20,并主动向FTP Client发起数据连接请求。

    而此时受我电脑防火墙的限制,FTP Server获得FTP Client的数据端口后,会主动发起数据连接请求,此时会被防火墙被屏蔽的。

    FTP Client无法正常接收FTP Server发送来的数据流,所以就会出现假死的现象。

    如果强制FTP使用被动模式,三次握手完成后,FTP Client会开启一个>1024的端口,并要求FTP Server开启一个端口(>1024),被动等待数据通道链接的开启。

    当FTP Client开启数据传输通道时,FTP Server就开始被动传输数据,不存在被墙住的问题,文件就可以正常下载下来了。

    总结:
    ftp默认主动模式,FTP 客户端和服务端会不时的开启新端口;
    
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Jeff Dean:机器学习在硬件设计中的潜力
    iNFTnews | 看见元宇宙的两面,何谓全真互联网和价值互联网?
    线性回归基本原理和公式推导
    git工具的安装及使用
    艾美捷Abnova NEUROD6单克隆抗体(M17)说明书
    Spring框架中bean的生命周期
    程序员学习的5个国外网站推荐
    java毕业生设计忆居民宿管理计算机源码+系统+mysql+调试部署+lw
    ruoyi-cloud 升级mybatis plus 报错 Invalid bound statement (not found)
    介绍一下浏览器的缓存(Expires, Cache-Control等)
  • 原文地址:https://blog.csdn.net/python113/article/details/128076974