Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для Terabaytus
9 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 88

Дозагрузка файла

17.07.2016, 19:41. Показов 1289. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, реализую клиент серверное приложение с возможностью догрузки файла после обрыва соединения наладил двустороннюю связь (протокол) то есть получаю количество байт с сервера сколько осталось не загружено и отправляю его клиенту, но не могу сообразить как это число применить что бы клиент понял с какого места файла ему предавать данные ?


Сервер


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
while(true){
                Socket socket = ss.accept();
        
                InputStream in = socket.getInputStream();
                DataInputStream din = new DataInputStream(in);
               
                int filesCount = din.readInt();//получаем количество файлов
                area.setText("Передается " + filesCount + " файлов\n");
                
                for(int i = 0; i<filesCount; i++){
                    area.append("Принят " + (i+1) + " файл: \n");
                    
                    long fileSize = din.readLong(); // получаем размер файла
                                
                    fileName = din.readUTF(); //приём имени файла
                   
                    File folder = new File("D://Photo_and_Video//");// доступ к папке с файлами
                    File[] listOfFiles = folder.listFiles();// получаем список файлов
                    for (File f : listOfFiles) {
 
                        if(fileName.equals(f.getName())){// сравниваем имена файлов получаемого и который есть
                    
                            
                            if(fileSize == f.length()){
                                 
                            System.out.println("Файлы совпадают");
                            
                            }else{
                                
                                long missingBytes = fileSize - f.length();
                                
                                try {
                                
                                    DataOutputStream outD;// переменная потока отправляемых данных
                                
                                outD = new DataOutputStream(socket.getOutputStream());//подключаемся к socket  
                                outD.writeLong(missingBytes);//отправляется ответ сервера клиенту
                                
                                outD.flush();
                             
                        } catch (IOException e) {
                            e.printStackTrace();
                            
                        }
                                System.out.println("Число не совпадения на " + missingBytes + " байт, отослано клиенту");
                                
                            }
                        }
                        
                    }



Клиент


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int countFiles = list.size();//создаём переменную countFiles (подсчёт файлов)
 
            DataOutputStream outD; // переменная потока отправляемых данных
            DataInputStream inpD;// переменная потока отправляемых данных
            try {
 
                outD = new DataOutputStream(client.getOutputStream());
 
                outD.writeInt(countFiles);//отсылаем количество файлов
 
                for (int i = 0; i < countFiles; i++) {
                    File f = new File(list.get(i));
 
                    outD.writeLong(f.length());//отсылаем размер файла
                    outD.writeUTF(f.getName());//отсылаем имя файла
 
                    inpD = new DataInputStream(client.getInputStream());//принемаем из socket входной поток
                    missingBytes = inpD.readLong();//принемает ответ сервера (число)
 
                    System.out.println(missingBytes + " число не хватки байт");
 
                    
                    FileInputStream in = new FileInputStream(f);
                    byte[] buffer = new byte[64 * 1024];// размер буфера
                    int count;//колличество отправленых байт
 
                    while ((count = in.read(buffer)) != -1) {
                        outD.write(buffer, 0, count);
                    }
                    outD.flush();
                    in.close();
                }
               
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
 
        }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2016, 19:41
Ответы с готовыми решениями:

Дозагрузка файла после потери соединения при передачи файла по средствам сокета. (Delphi)
Нужна помощь (совет, консультация) в реализации дозагрузки фаила при разрыве соединения во время его передачи (на подобии торрента)....

Загрузка и дозагрузка файла после потери соединения
Как сделать, чтобы при потери соединения файл дозагружался, а не загружался заново? WebClient load = new WebClient(); ...

Дозагрузка страницы
не знаю правильно ли я выбрал место для темы надеюсь да суть такова есть код &lt;?php if (isset($_POST)) { ...

7
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
18.07.2016, 06:49
Цитата Сообщение от Terabaytus Посмотреть сообщение
получаю количество байт с сервера сколько осталось не загружено
Столько байт пропускаешь от начала файла, и продолжаешь грузить с (n+1)-го. Правда это сработает при условии последовательной загрузки. Без параллельных потоков.
0
 Аватар для Terabaytus
9 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 88
18.07.2016, 06:54  [ТС]
aleksandy так в это всё и упирается "Столько байт пропускаешь от начала файла" как это реализовать в коде над этим я голову и ломаю
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
18.07.2016, 11:53
Лучший ответ Сообщение было отмечено Terabaytus как решение

Решение

Terabaytus, просто создаёте FileInputStream и вызывает skip - столько сколько байтов вам нужно пропустить. Дальше передаёте остаток файла.
1
 Аватар для Terabaytus
9 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 88
29.07.2016, 15:29  [ТС]
turbanoff, взгляните пожалуйста

Сделал всё как вы и сказали и показывает, что он целый. Но когда просматриваешь его, видео обрывается ровно на том месте, где закончилась первая попытка закачки


Сервер

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
System.out.println("Размер файла не совпадает");
                                    
                                    long missingBytes = fileSize - f1.length();//fileSize размер пришедшего файла - f1 размер уже имеющегося
                                    long missingBytes1 = fileSize - missingBytes;
                                    System.out.println( missingBytes1 +  " не закаченых байт, отослано клиенту");
                                
                                    try {
                                    
                                    DataOutputStream outD;// переменная потока отправляемых данных
                                    outD = new DataOutputStream(socket.getOutputStream());//подключаемся к socket  
                                    outD.writeLong(missingBytes1);//отправляется ответ сервера клиенту
                                    outD.flush();
                                    fileSize = missingBytes;//заменяем настоящий размер файла оставшимеся байтами получеными от вычетания из настоящего размера файла
                                    System.out.println("Закачиваем " +fileSize);
                                    System.out.println("Закачиваем оставшиеся байты");
                                    
 try { 
             byte[] buffer = new byte[64*1024];
             FileOutputStream outF = new FileOutputStream("D://Photo_and_Video/"/*"Z://exchange//room_04//Server_COD//"*/ + fileName, true);
            
             int count, total = 0;
             
             while ((count = din.read(buffer, 0, (int) Math.min(buffer.length, fileSize-total))) != -1){               
                 total += count;
                 outF.write(buffer, 0, count);
             
                 if(total == fileSize){
                     break;
                 }
              }
             
             outF.flush();
             outF.close();
             area.append("Файл принят\n---------------------------------\n");            
         
     }catch(Exception e){
         e.printStackTrace();
        }


Клиент


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
try {
 
                outD.writeLong(missingBytes);//отсылаем размер файла
                outD.writeUTF(f.getName());//отсылаем имя файла
 
                System.out.println("Файл отослан " + f.getName());
                FileInputStream fis = new FileInputStream(f);// create new file input stream
                    fis.skip(missingBytes);// skip bytes from file input stream
                    byte[] buffer = new byte[64 * 1024];// размер буфера
                    int count;//колличество отправленых байт
 
                    while ((count = fis.read(buffer)) != -1) {
                        outD.write(buffer, 0, count);
 
                    }
                    System.out.println("Файл отослан " + count);
                   /* if(count == -1){
                        f.delete();
                      }*/
                    outD.flush();
                    fis.close();// releases all system resources from the streams
            } catch (IOException e) {
                e.printStackTrace();
             }
0
 Аватар для Terabaytus
9 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 88
31.07.2016, 10:14  [ТС]
turbanoff, в чём может быть причина ?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
31.07.2016, 13:44
Terabaytus, по коду непонятно. Попробуйте воспользоваться отладчиком
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
31.07.2016, 15:28
Цитата Сообщение от Terabaytus Посмотреть сообщение
то есть получаю количество байт с сервера сколько осталось не загружено и отправляю его клиенту
Правильнее на стороне клиента хранить информацию о том, сколько байт загрузилось, и при восстановлении соединения просить у сервера файл заново, пропуская (как Вам выше сказали) количество полученных байт. На стороне сервера разве-что в лог писать, что закачка была прервана. Качать весь файл заново, или докачивать, что осталось - это дело клиента.

Цитата Сообщение от Terabaytus Посмотреть сообщение
показывает, что он целый. Но когда просматриваешь его, видео обрывается ровно на том месте, где закончилась первая попытка закачки
Если судить по размеру файла, зарезервированному на диске, то он как-раз будет совпадать с полным размером файла, с содержимым только беда. Опять же - клиент должен уметь хранить как-то реальное количество закачанных байт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.07.2016, 15:28
Помогаю со студенческими работами здесь

JQuery дозагрузка даных
Привет всем. Я еще плохо знаю JQuery. Но постепенно разбираюсь. Возник у меня вопрос о динамической до загрузки данных. У меня есть 3...

Дозагрузка данных в UITableView при скролле
С веб-сервиса загружаю порцию данных, отображаю их на UITableViewController. Как после прокрутки до последней записи загрузить еще одну...

Написать текстовый редактор, в котором продемонстрировать открытие файла, сохранение файла, создание нового файла
№ 5. Написать текстовый редактор, в котором продемонстрировать открытие файла, сохранение файла, создание нового файла – чистого листа, на...

Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла
3)Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.

Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла
Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru