Android - 使用Apache Commons Net,使用移动网络时连接超时错误

时间:2015-12-06 15:20:21

标签: android ftp ftp-client apache-commons-net

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

@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:在360000ms:isConnected失败后无法连接到xxx.xx.xxxx.xx.xx / xxx.xxx.xx.x(端口21):ETIMEDOUT(连接超时)

在此错误中,它表示尝试360.000ms = 6分钟后无法连接。但实际上,我在1分钟或不到1分钟内得到这个错误。所以它甚至没有等待6分钟。

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

2 个答案:

答案 0 :(得分:0)

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

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

您可能会尝试使用FTP主动和被动模式,IPv4与IPv6,也许您可​​以使应用程序在此特定的蜂窝网络中运行。但它可能仍然在另一个网络中被打破。我反而建议您免除所有这些麻烦并使用不同设计问题的不同协议,如HTTP / HTTPS或SFTP(但不具有相同问题的FTPS)。

答案 1 :(得分:0)

经过一些研究和测试后,我发现由于FTP服务器设置而出现此问题。我之所以使用我大学的FTP服务器,但很可能是因为安全问题,他们从一开始就大大减少了我的问题。我现在正在使用我朋友的FTP服务器进行测试。

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