0

我有一个 Android 应用程序需要在操作的特定点执行一些 FTP 任务:

  • 将手机文件夹中的文件列表上传到 FTP 主机
  • 获取 FTP 主机文件夹中的文件列表
  • 将选定的文件从 FTP 下载到手机,下载后从 FTP 主机中删除文件

它是代码并且在 FTP 下运行良好,但是当我转到 FTPS (DDL/TLS) 时,一切都出错了,上面的消息。

下载:

2020-08-20 20:45:45.556 17674-18751/com.centralock.android.app.centralock I/System.out:端口 10,1,10,46,165,169

2020-08-20 20:45:45.716 17674-18751/com.centralock.android.app.centralock I/System.out: 200 PORT 命令成功

2020-08-20 20:45:45.732 17674-18751/com.centralock.android.app.centralock I/System.out: STOR Folder1/Folder2/File1.txt

2020-08-20 20:47:53.207 17674-18751/com.centralock.android.app.centralock I/System.out: 425 无法建立数据连接:连接超时

列出文件的尝试做同样的事情。

我发现了一些我认为可能有帮助的代码: SSLSessionReuseFTPSClient / prepareDataSocket,但我认为我没有正确安装它:我只是将代码包含在我的 FTP 管理类文件中。

4

2 回答 2

0

... I/System.out:端口 10,1,10,46,165,169

PORT 命令表明您在 FTP 中使用主动模式。在活动模式下,服务器创建与客户端的连接以传输数据。众所周知,如果有防火墙挡住或完成了一些 NAT 或运营商级 NAT(即从家庭网络到互联网或从移动网络的典型访问),这种模式会导致大量问题。

基础设施(防火墙、NAT)可能会尝试为从服务器到客户端的连接添加必要的防火墙和转换规则,但需要对 PORT 命令的可见性。使用 FTPS,控制连接是加密的,因此无法查看。这就是为什么它在 FTPS 上失败但在 FTP 上失败的原因。

最好的方法是首先不使用 FTP 和 FTPS,因为众所周知这些协议会引起麻烦。如果服务器支持,请改用 HTTP 或 SFTP(通过 SSH 传输文件)。如果这不可能,请在被动模式下使用 FTP,客户端将创建与服务器的连接,而不是其他方式。使用enterLocalPassiveMode似乎是执行此操作的方法,另请参见Apache Commons Net FTPClient 和 listFiles()

于 2020-08-21T03:58:37.863 回答
0

我们在玩主动与被动。你是对的,被动是正确的。

事实证明,在发布此消息后的第二天,我们的 NAS 制造商发布了代码更新,一切都刚刚开始工作。所以请随意忽略这个求助请求!

于 2020-08-22T15:58:22.240 回答