Commons FTPClient зависает после загрузки большого файла

Я использую Apache Commons FTPClient 3.1 для простой загрузки файлов. storefile() отлично работает для файлов меньшего размера (менее 100 МБ), но когда я пытаюсь загрузить что-то больше 100 МБ, загрузка завершается, но просто зависает.

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

Вот суть того, что я делаю:

ftpClient.connect(...);
ftpClient.login(...);
ftpClient.enterLocalPassiveMode();
boolean success = ftpClient.storeFile(...);
if(success)
...

Программа зависает на строке 4 для больших файлов, но успешно загружает файл.


person J. Lin    schedule 10.05.2012    source источник


Ответы (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 минут.

person John    schedule 10.05.2012
comment
Спасибо. В этом была проблема. - person J. Lin; 11.05.2012