2012-05-10 4 views
2

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

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

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

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

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

ответ

6

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 

Это заставит методы загрузки файлов/загрузки, чтобы послать Nööp примерно каждые 5 минут.

+0

Спасибо. Это была проблема. – JPL

Смежные вопросы