Commons FTPClient зависает после загрузки большого файла
Я использую Apache Commons FTPClient 3.1 для простой загрузки файла. storefile() прекрасно работает для файлов меньшего размера (до 100 МБ), но когда я пытаюсь загрузить что-то более 100 МБ, загрузка заканчивается, но просто зависает.
Я пытался войти в пассивный режим, как предлагали другие, но, похоже, проблема не устранена. Я пробовал несколько FTP-серверов с одинаковыми результатами, поэтому я предполагаю, что это не хост.
Вот суть того, что я делаю:
ftpClient.connect(...);
ftpClient.login(...);
ftpClient.enterLocalPassiveMode();
boolean success = ftpClient.storeFile(...);
if(success)
...
Программа зависает в строке 4 для больших файлов, но успешно загружает файл.
1 ответ
https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html
Его время истекло. Эта ссылка может помочь.
Функция поддержания активности канала управления: во время передачи файлов соединение для передачи данных занято, но соединение для управления не используется. FTP-серверы знают, что управляющее соединение используется, поэтому не будут закрывать его из-за отсутствия активности, но сетевым маршрутизаторам намного сложнее узнать, что управляющие соединения и соединения для передачи данных связаны друг с другом. Некоторые маршрутизаторы могут рассматривать управляющее соединение как бездействующее и отключать его, если передача через соединение для передачи данных занимает больше времени, чем допустимое время простоя для маршрутизатора. Одним из решений этой проблемы является отправка безопасной команды (например, NOOP) через управляющее соединение для сброса таймера простоя маршрутизатора. Это включено следующим образом:
ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes
Это приведет к тому, что методы загрузки / выгрузки файлов будут отправлять NOOP примерно каждые 5 минут.