【问题标题】:FTPClient.storeFile() Began Failing [duplicate]FTPClient.storeFile() 开始失败 [重复]
【发布时间】:2021-06-16 09:51:41
【问题描述】:

我有一个 Java 程序,它通过 FTP 将新的/更改的文件上传到我的网站。它目前使用 Apache Commons Net Library,版本 3.8.0。

搬到新城市后,我使用了近 20 年的程序开始失败。它仍然连接到 FTP 服务器并成功登录。但是当它尝试上传文件时,它会暂停 20-30 秒,然后失败。它总是在第一个文件上失败,100% 的时间。

失败的调用是 org.apache.commons.net.ftp.FTPClient.storeFile()。文档说 storeFile() 变为如果成功完成,则为 false。奇怪的是,该方法还记录了抛出各种形式的 IOException。文档没有说明该方法何时或为何决定返回布尔值而不是抛出异常。

我的问题是 storeFile() 返回 false(表示失败),并且 从不 抛出异常。所以,我没有错误消息告诉我是什么导致了失败。文件名和路径看起来不错。网络托管公司试图确定失败的原因,但没有成功。

这个问题已经持续了好几个星期了。有人对如何调试有任何想法吗?

【问题讨论】:

    标签: java ftp ftp-client


    【解决方案1】:

    如果您的问题的原因是搬到一个新城市,而您仍然可以打开控制连接,那么最可能的罪魁祸首是您的底层 ISP 和网络发生了变化,导致数据传输流无法打开。

    FTP 端口 21 用于打开连接,通常所有网络都允许,但随后会通过控制连接协商一个新的、随机的、非特权端口,然后用于实际数据传输。我敢打赌,您的“storeFile()”正在尝试打开数据连接并遇到可能导致超时的块。您可能将此解释为“从不引发异常”,但实际上它可能会在您坐下来等待足够长的时间后引发 Timeout Exception。

    我推荐的一件事是找到一种方法让您的 FTP 客户端使用 PASSIVE 模式进行 FTP 数据传输。这被设计到协议中以避免这些类型的问题。您可以在 wiki https://en.wikipedia.org/wiki/File_Transfer_Protocol 的“通信和数据传输”下详细了解它

    【讨论】:

    • 好吧,我知道我的 ISP 没有阻止 FTP,因为我可以使用不同的 FTP 客户端(例如 WinSCP)上传和下载文件。必须深入研究我失败的客户端代码,看看它是否使用了被动模式。
    • 我相信WinSCP默认使用被动模式,。它不应该很难设置。我环顾四周,找到了一个应该可以工作的示例:查看javatips.net/api/org.apache.commons.net.ftp.ftpclient 查找示例 29 - 项目:YetAnotherBackupMod-Master 文件:FTPTask.Java 他设置了 ftp_client.enterLocalPassiveMode();然后在几行之后执行 storeFile。
    • 另外澄清一下,ACTIVE 模式会动态打开计算机上的端口以侦听数据连接。这意味着当您说“我的 ISP 没有阻止 FTP”时,这意味着“ISP 允许以被动模式从其客户到 FTP 服务器进行数据传输的端口 21 连接”。这与“ISP 允许客户打开与服务器的端口 21 连接,然后让该服务器在某个随机端口 123xyz 上与客户联系”不同。此外,您自己的 PC/Wifi 路由器上的任何 NAT/防火墙也可能会阻止连接。
    • 你是对的!深入研究 Apache FTPClient 类的代码后,我发现它的默认数据连接模式是 ACTIVE。在我确保在尝试上传文件之前将其设置为 PASSIVE 之后,一切都神奇地工作了(笑)。看起来我非常幸运 ACTIVE 模式与我以前的 ISP 一起工作。注意:我还发现 FTPClient 在连接/登录过程中将模式重置为 ACTIVE。因此,我移动了将模式更改为 PASSIVE 的代码行,使其正确在登录之后,这就是它开始工作的时候。感谢您的洞察力。
    • 太棒了!我很高兴它成功了!请随时将我的答案标记为正确。我将不胜感激!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2023-03-27
    • 2017-03-06
    • 2017-04-01
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多