Проблема с сетевым сбоем диспетчера загрузок

Я делаю утилиту загрузки в java, которая будет загружать файлы с ftp-сервера. Я использую класс URLConnection, чтобы установить соединение и входной поток в качестве объекта потока. Проблема, с которой я сталкиваюсь, заключается в сценарии сбоя сети, то есть при загрузке определенного файла, если подключение потеряно, и после восстановления подключения я хочу, чтобы он возобновил загрузку с того места, где он был остановлен ранее.

Для этого я сделал следующее: -

/*Здесь я пытаюсь пропустить количество загруженных байтов, чтобы получить указатель в потоке, откуда он должен возобновить загрузку. Метод skip() не обязательно может пропускать количество байтов, заданное в качестве параметра, и, следовательно, цикл пока. */

while(totalByteSkipped!=downloaded) 
{ 
      bytesSkipped = stream.skip(downloaded-totalByteSkipped); 

      totalByteSkipped = totalByteSkipped+bytesSkipped; 
} 

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

Надеясь получить альтернативный подход к тому же самому. Спасибо!!


person sherry    schedule 08.08.2011    source источник


Ответы (2)


Вам необходимо реализовать перезапуск FPT, чтобы возобновить загрузку. Если ваш сервер поддерживает это, вы можете указать смещение в файле.

Есть ли причина, по которой вы не используете уже существующий FTP-клиент? FTP-клиент Commons Net поддерживает перезапуск.

person Vlad    schedule 08.08.2011
comment
Привет, Влад, спасибо за ответ. Я использовал FtpClient из пакета sun.net.ftp. Не знал о классе FTPClient из apache. Обязательно постараюсь посмотреть, поможет ли это мне решить мою проблему. Спасибо еще раз :-) - person sherry; 08.08.2011
comment
@Shabeena: Тогда используйте docjar.com /docs/api/sun/net/ftp/ - person Vlad; 08.08.2011
comment
У FtpClient нет удобного метода для смещения перезапуска, но у FTPClient от apache есть. - person sherry; 08.08.2011
comment
Плохо, я не заметил, что это была версия OpenJDK, на которую я ссылался. Тогда, я думаю, вам лучше использовать клиент Commons. - person Vlad; 08.08.2011
comment
Как было предложено, я использовал классы FTPClient и FTPFile из клиентского API Commons, но столкнулся с другой проблемой. Я использую метод setRestartOffset() FTPClient, чтобы установить смещение для возобновления загрузки в случае ручной паузы и сбоя сети. Хотя мне удалось правильно установить смещение в случае паузы, смещение в случае сбоя сети каким-то образом неправильно установлено, что приводит к повреждению файла. - person sherry; 09.08.2011
comment
Вот фрагмент используемой логики смещения: if(paused) { client.setRestartOffset(downloaded); } иначе, если (networkFailure) { client.setRestartOffset (скачан); поток = client.retriveFileStream (getFileName (url)); } иначе {поток = client.retriveFileStream(getFileName(url)); // нормальный поток } Любые предложения по этому поводу будут оценены. - person sherry; 09.08.2011
comment
Смещение установлено правильно, значение downloaded, вероятно, неверно. - person Vlad; 09.08.2011
comment
Но «загружено» увеличивается только после того, как байты записаны в файл. В таком случае я не понимаю, как значение «загружено» может быть неверным. - person sherry; 09.08.2011
comment
Обычно смещение перезапуска должно быть установлено непосредственно перед командой передачи файла. При сбое сети попробуйте: fileName = getFileName(url); client.setRestartOffset(downloaded); stream = client.retrieveFileStream(fileName); убедиться, что вы не запускаете какие-либо команды ftp между смещением перезапуска и передачей файла. - person Vlad; 09.08.2011
comment
Этот гам тоже имеет значение! Пробовал отладку и пришел к выводу, что после выполнения приведенных выше операторов в указанной последовательности смещение окончательно устанавливается на 0, а не на загрузку. - person sherry; 09.08.2011
comment
Еще одна идея: клиент переподключается, когда вы звоните retrieveFileStream() после сбоя сети, или он переподключается в фоновом режиме? Вы пытались провести мониторинг TCP, чтобы точно увидеть, что происходит между клиентом и сервером? - person Vlad; 09.08.2011
comment
Ну, понятия не имею об этом, не знаю, как я отслеживаю TCP! Пробовал другую альтернативу. client.retriveFileStream(fileName); client.setRestartOffset(скачан); Это правильно устанавливает смещение, но все же приводит к повреждению файла. - person sherry; 09.08.2011

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

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

person SJuan76    schedule 08.08.2011