![]() |
|
#1
|
||||
|
||||
![]() Всем доброго времени суток.
Задача следующая: скачать файл с сервера, который передается им просто-напросто открытым текстом. Упрощенно говоря, сервер дает его так: Код:
Но это лирика, сервер гарантированно работает, проверялось клиентом на перле. Клиент должен этот файл корректно принять и записать на диск. Но есть одно но: нельзя использовать никаких компонентов, ни инди, ни прочих качалок, исключительно WinSock. Сам я, в течении уже третьего вечера пытаюсь реализовать сие дело таким образом: Код:
Таким образам передавались разные типы файлов, от `man iptables`, то есть простого текста, до картинок и музыки. Результаты следующие: Начало и середина текста выглядели, вроде бы, адекватно, но конец иногда дублировался, иногда образался, всегда по-разному. Вместо невинной картинки приходила какая-то невнятная цветная мазня. С мп3 дело обстоит немного лучше, трек либо укорачивался, либо удлиннялся, с пробелами(которые плеер просто пропускал) примерно по 0.2 сек. Так как таким образом планируется передавать в основном исполняемые файлы, подобные баги-глюки-лаги абсолютно неприемлемы. Буду благодарен за комментарии по теме, особенно за рабочий код. |
#2
|
||||
|
||||
![]() Ставишь компонент TIdHTTP;
Код:
Кнопка "+" - весы в правом верхнем углу сообщения... |
#3
|
|||
|
|||
![]() Цитата:
уЧИСЬ ЧИТАТЬ |
#4
|
|||
|
|||
![]() раз речь идет о скачке, я немного спрошу по этому курсу?) только по поводу IdHTTP;
вот я качаю какой-либо файл... как определить его загрузку посредствои progressbar? не подскажите? ![]() |
#5
|
|||
|
|||
![]() используя idHTTP вроде никак, лучше winInet юзать
Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя. |
#6
|
||||||
|
||||||
![]() ну хорошо, winInet.. отъюзал
![]() Код:
Код:
и ставим прогрессбар на панель: Код:
осталось только отловить оставшееся время закачки ![]() |
#7
|
|||
|
|||
![]() если знаешь скорость и размер делим размер на скорость получаем время
Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя. |
#8
|
|||
|
|||
![]() а если незнаю?
![]() |
#9
|
|||
|
|||
![]() раз у тебя есть прогресс бар значит знаешь
Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя. |
#10
|
|||
|
|||
![]() нет, не знаю.. надо ведь сначала получить размер из файла, и скорость получить (это я подавно не знаю)... и в каком формате время выдасться?
|
#11
|
|||
|
|||
![]() у тебя буфер равен 1024 байтов 1 КБ воемя за которое он закачет 1 кб за секунду сколько он КБ закачает такова и скорость
Вот получение размера файла Код:
Это я выдрал из своего класса, много у тебя нет, но основно смысл должен быть понять. Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя. |
#12
|
|||
|
|||
![]() должен
![]() я впервые этот компонент увидел ![]() |
#13
|
|||
|
|||
![]() Цитата:
Попробуй определять размер последнего принимаемого блока. У тебя стоит размер 4196 для всех. А если размер завершающего, положим, 2000... Получим 2196 байт мусора... вот и появляется в конце файлов невесть что. Не пользовался приведёнными тобой функциями. Если функция Recv возвращает размер принятого блока(у тебя помещает длина блока в переменную iRet) то в строке BlockWrite(outy, BigRecy, 4196); замени цифру 4196 на переменную iRet. Т.е. BlockWrite(outy, BigRecy, iRet); Если нет, значит надо придумать как. Мысль я тебе дал. ![]() Последний раз редактировалось Амон, 17.11.2008 в 20:00. |
#14
|
|||
|
|||
![]() Цитата:
советую реализовать если это возможно и достаточно знаний на php ![]() |
#15
|
|||
|
|||
![]() Цитата:
TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); Последний параметр - кол-во считанных байт. Инкрементный или за блок - не помню, попробуешь - определишь. Только придется в 2 этапа делать. Сначала получаешь размер ресурса, потом качаешь и вычисляешь %%. |