Android — с Apache Commons Net, ошибка времени ожидания подключения при использовании сотовой сети

Я пытаюсь узнать, как подключить свое приложение к определенному FTP-серверу. Для этой цели я использую сеть Apache Commons, которая довольно хороша. Пока мне удалось подключить свое приложение к FTP-серверу, пока я подключен к WiFi. Пока я подключен к Wi-Fi, он подключается и входит в систему без проблем, однако, когда я пытаюсь подключить свой FTP-сервер к своей сотовой сети, он выдает ошибку тайм-аута соединения. Сначала я подумал об этом из-за скорости моей сотовой сети. Поэтому я увеличил тайм-аут, чтобы дать моей сотовой сети гораздо больше времени для подключения, но это не сработало. Я имею в виду, что это в основном не работает. Вот код, который я использую. Это класс, расширенный 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: не удалось подключиться к xxx.xx.xxxx.xx.xx/xxx.xxx.xx.x (порт 21) через 360000 мс: isConnected не удалось: ETIMEDOUT (время ожидания подключения истекло)

В этой ошибке говорится, что не удалось подключиться после попытки 360 000 мс = 6 минут. Но на самом деле я получаю эту ошибку через 1 минуту или менее 1 минуты. Так что это даже не 6 минут ожидания.

Понятно, что я делаю что-то не так. Я был бы очень рад, если бы кто-то указал на это. Спасибо.


person BlocBloc    schedule 06.12.2015    source источник


Ответы (2)


FTP — это протокол, который использует TCP-соединение для передачи FTP-команд (управляющее соединение), но для каждой передачи данных использует новое TCP-соединение (соединение для передачи данных). Информация о конечной точке соединения для передачи данных (т. е. об используемом порте) обменивается внутри управляющего соединения.

Эта настройка превращает FTP в кошмар всякий раз, когда задействованы брандмауэры или трансляция сетевых адресов (NAT), что обычно имеет место при подключении из частных сетей, а также из сотовых сетей. Иногда эти проблемы можно обойти, переключаясь между пассивным и активным режимом, иногда для решения этих проблем внутри сети используются прозрачные вспомогательные приложения, а иногда даже эти вспомогательные приложения не помогают или даже ухудшают ситуацию.

Вы можете попробовать поиграть с активным и пассивным режимом FTP, IPv4 или IPv6, и, возможно, вы сможете заставить приложение работать в этой конкретной сотовой сети. Но он все еще может быть сломан в другой сети. Вместо этого я рекомендую вам избавить вас от всех этих проблем и использовать другой протокол, который не имеет проблем с дизайном, например HTTP/HTTPS или SFTP (но не FTPS, у которого такие же проблемы).

person Steffen Ullrich    schedule 06.12.2015
comment
Насколько я знаю, в сети Apache Commons есть два метода принудительного включения пассивного режима, .enterLocalPassiveMode(); и .enterRemotePassiveMode();, но мне нужно сначала подключить свой FTP-сервер для использования таких методов. В противном случае это не дает мне ошибки подключения. Я не знаком с FTP-серверами или другими методами, которые вы предложили. Можете ли вы помочь мне, если мне придется изменить его, чтобы сделать его более стабильным? - person BlocBloc; 06.12.2015
comment
@BlocBloc: я не знаком с конкретными реализациями в Apache Commons, я знаю только внутренности и проблемы самого протокола FTP. Поэтому я рекомендую держаться подальше от него, потому что он просто вызывает проблемы в описанных мной настройках, и многие из них не могут быть исправлены на стороне клиента или сервера. - person Steffen Ullrich; 06.12.2015

Проведя некоторые исследования и тесты, я обнаружил, что эта проблема возникает из-за настроек FTP-сервера. Я использовал для этого FTP-сервер моего университета, но, скорее всего, из-за проблем с безопасностью они значительно сократили время ожидания, что было моей проблемой с самого начала. Сейчас я использую FTP-сервер моего друга для тестирования.

Решение: нет прямого решения для этого, если у вас нет разрешения на изменение настроек вашего FTP-сервера. Возможно, вы захотите попробовать другие FTP-серверы, чтобы избежать или сузить проблему. Но я хотел бы дать быстрый совет таким новичкам, как я. Если вы пытаетесь сделать что-то вроде приложения для сообщений или около того, не начинайте делать это с FTP, а вместо этого используйте MySQL. FTP-серверы, как уже указывал Штеффен, действительно ненадежны и могут вызвать у вас много проблем, когда вы думаете, что готовы после завершения своего кода.

person BlocBloc    schedule 07.12.2015