Android - 使用 Apache Commons Net,使用蜂窝网络时出现连接超时错误

Android - With Apache Commons Net, Connection Timeout Error while using Cellular Network

我正在尝试学习如何将我的应用程序连接到某个 FTP 服务器。为此,我使用非常好的 Apache Commons 网络。到目前为止,当我连接到 WiFi 时,我设法将我的应用程序连接到 FTP 服务器。当我连接到 Wi-Fi 时,它可以顺利连接和登录,但是,当我尝试将我的 FTP 服务器与我的蜂窝网络连接时,它会给我连接超时错误。首先我认为这是因为我的蜂窝网络速度。因此,我增加了超时时间,以便为我的蜂窝网络提供更多连接时间,但它没有用。我的意思是它基本上不起作用。这是我使用的代码。它位于由 AsyncTask 扩展的 class 中。

@Override
    protected String doInBackground(String[] params) {
        String temp = "Files : \n";
        FTPClient client = new FTPClient();
        client.setConnectTimeout(360 * 1000);
        client.setDefaultTimeout(360 * 1000);

        try {
            Log.d("FtpDebug", "Connecting ...");
            client.connect(myftpservername);
            client.enterLocalPassiveMode();
            Log.d("FtpDebug","Connected!");
        }catch (Exception e){
            Log.d("FtpError", e.toString());
        }

我说它不起作用,因为它给我这个错误

D/FtpError: java.net.SocketTimeoutException: failed to connect to xxx.xx.xxxx.xx.xx/xxx.xxx.xx.x (port 21) after 360000ms: isConnected failed: ETIMEDOUT (Connection timed out)

在这个错误中它说尝试 360.000ms=6 分钟后连接失败。但实际上,我在 1 分钟或不到 1 分钟内收到此错误 minute.So 它甚至没有等待 6 分钟。

很明显我做错了。如果有人指出这一点,我会很高兴。谢谢

FTP 是一种协议,它使用 TCP 连接来传输 FTP 命令(控制连接),但对于每个数据传输,它都使用一个新的 TCP 连接(数据连接)。有关数据连接端点(即使用的端口)的信息在控制连接内交换。

每当涉及防火墙或网络地址转换 (NAT) 时,此设置都会使 FTP 成为一场噩梦,这通常是从专用网络和蜂窝网络连接时的情况。有时可以通过在被动和主动模式之间切换来解决这些问题,有时在网络内部使用透明的帮助应用程序来处理这些问题,有时甚至这些帮助应用程序也无济于事,甚至会使情况变得更糟。

您可以尝试使用 FTP 主动和被动模式,IPv4 与 IPv6,也许您能够使应用程序在这个特定的蜂窝网络中工作。但它可能仍然在另一个网络中被破坏。相反,我建议您省去所有这些麻烦,并使用没有设计问题的不同协议,例如 HTTP/HTTPS 或 SFTP (但不是具有相同问题的 FTPS ) .

经过一些研究和测试后,我发现这个问题是由于 FTP 服务器设置引起的。我为此使用了我大学的 FTP 服务器,但很可能是因为安全问题,它们显着减少了超时时间,这从一开始就是我的问题。我现在正在使用我朋友的 FTP 服务器进行测试。

解决方案:如果您无权更改 FTP 服务器的设置,则没有直接的解决方案。您可能想尝试使用其他 FTP 服务器来避免或缩小问题范围。但我想给像我这样的新手一个快速的建议,如果你正在尝试做类似消息应用程序之类的东西,不要从 FTP 开始,而是使用 MySQL。 FTP 服务器,正如 Steffen 已经指出的那样,确实不可靠,当您认为完成代码后准备就绪时,可能会给您带来很多麻烦。