IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Reply to this topicStart new topic
> Как сверить файлы сервера с файлами клиента
SaintDark
сообщение 14 Aug 2012, 16:33 (Сообщение отредактировал SaintDark - 14 Aug 2012, 16:54)
Сообщение #1

Working hard
Сообщений: 455
Спасибо сказали: 558 раз




Уточняю:

Имеется сервер, на нем размещены файлы.
Имеется клиент, у него те же файлы, что и на сервере.

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

Как я думаю:

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

2. Написать программу обработчик (php), принимающую данный запрос, затем проверяющую, изменились ли файлы, затем Если они изменились, то перекачиваются клиенту. Если нет, то обновление не требуется.



Что предложите вы, товарищи знатоки? На чем писать программу-клиент?

А вообще я надеюсь на готовое решение

Можно нагугленное решение.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Эроласт
сообщение 14 Aug 2012, 17:50
Сообщение #2

Зануда
Сообщений: 2 236
Спасибо сказали: 2894 раза




Как я понял, тебе нужно устроить обновление игры?
Если да, то тогда предлагаю немного другую систему, покороче, и, наверное, более реальную в исполнении:
1. В файле.ini программы есть строка: lastexecute = дата.
2. При каждом запуске программа сверяет текущую дату с датой, прописанной в файле. Если дата совпадает, то пунт 3.b, если нет - то пункт 3.a
3.a. Программа посылает на сервер запрос, в котором указывает текущую версию игры (тоже по идее должно прописываться в .ini файле), сервер сравнивает ее с последним доступным обновлением - совпадает, значит обновление не нужно, не совпадает - дает файлы на закачку. Затем программа заменяет дату в файле на текущую.
3.b. Ничаво не делается.
Вся эта морока с файлами нужна для того чтобы программа лишний раз не запрашивала об обновлении - ты ведь, надеюсь, не собираешься каждый час новую версию выпускать?

Правда как посылать запросы я сам хз...)
Go to the top of the pageAdd Nick
 
+Quote Post
SerAlexandr
сообщение 14 Aug 2012, 17:54
Сообщение #3

Immortal
Сообщений: 1 080
Спасибо сказали: 2067 раз




Цитата(Erolast @ 14 Aug 2012, 20:50) *
1. В файле.ini программы есть строка: lastexecute = дата.

Лучше хеши файлов проверить. (MD5, SHA-1...)


--------------------
Будь я проклят... Татуин! Это чудесное место... Ой, спойлер (с) Фил Колсон.
Go to the top of the pageAdd Nick
 
+Quote Post
Shurup
сообщение 14 Aug 2012, 21:04 (Сообщение отредактировал Shurup - 14 Aug 2012, 21:12)
Сообщение #4

Щирий українець
Сообщений: 1 456
Спасибо сказали: 3023 раза




Проверка наличия версии
Даты могут врать (как на сервере, так у клиента). Не встречал ни одной программы, которая опиралась бы на даты в обновлениях.
Как это делается в нормальных программах:
- Прога знает какая у нее версия (число).
- Прога стучится по заранее договоренному адресу, напр. (самый простой способ реализации - http запрос, см. "серверная часть").
- Адрес отвечает какая версия последняя (пхп выводит число).
- Если текущая версия меньше - тогда происходит обновление.

Согласие пользователя на обновление
Если проверка показала наличие обновлений, пользователю желательно показать диалог: хочет ли он обновиться сейчас?
Даже сверхкритические апдейты не стоит делать принудительно и тем более без согласия пользователя (не известно, может ли он себе сейчас позволить обновление).

Начало обновления
Итак, пользователь дал добро обновиться:
Если программа не большая или трафик пользователя вам не жалко - то обновлять можно всю программу целиком. Тут два способа:
- можно отправить пользователя на веб-страничку скачивания свежей версии.
- либо начать ее скачивать средствами программы.
Первый вариант предпочтительнее, т.к. можно разместить скриншоты, полезную информацию, рекламу или еще что-то.
Второй вариант требует прямого доступа (direct link) к файлу (увеличивает бинарный трафик вашего сайта, отменяет возможность разместить файл на файлообменниках, в том числе и в дробпоксоподобных).

Если для уменьшения трафика планируется все-же обновлять программу частями
Прога стучится по еще одному адресу и получает список свежих файлов.

Например, вот в таком виде:
Код
105
http://mysite.com.ua/download/partial/
filename1.ext, 101, 22255, 9d15b1654c84f232e15781a
filename2.ext, 99, 2185, 8d15b1654c84f232e15781b1b
filename4.ext, 105, 21255, 7ad15bs1654c84f232e15781c
dir1/filename5.ext, 105, 2505, 6ad15b1654c84f232e15781d
dir2/filename6.ext, 103, 22255, 5d15b1654c84f232e15781e

Первая строка - номер свежей версии, вторая - путь для скачивания. дальше список файлов:
первая "колонка" - имя и путь к файлу,
вторая - версия в которой файл последний раз изменился
третья - размер файла в байтах
четвертая - хеш (напр. md5)

прога в цикле перебирает эти строки и проверяет:
- если нет такого файла или версия в которой он менялся последний раз - больше текущей, тогда однозначно добавить в список скачивания.
иначе*, сравнить размер файлов и если он совпадает - сравнить хеши.

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

Скачивание и обновление
Руководствуясь списком файлов из пред. пункта - скачиваем их с указанного пути.
Скачивать лучше во временную директорию. После скачивания - проверить размер и хеш. если что-то не совпало - говорим "Увы, обновление не удалось".
Иначе, проверяем, не висит ли в памяти наше приложение, если да - вынуждаем пользователя его закрыть (корректно).
Копируем файлы из временной папки в папку с приложением, и если в процессе копирования не произошло ошибок - говорим, что все успешно, если нет - то говорим, что "обновление произошло с ошибками, рекомендуем установить прогу заново".
Удаляем файлы из временной папки.

Серверная часть
Серверная часть не обязательно должна быть на php. она вообще может состоять из одного текстового файла, который заполняется вручную автором, или с помощью какой-то самописной утилиты, и затем выкладывается в сеть.
Для автоматизации этого дела, нужно будет сделать скрипт ревизии. Он:
- загружает текущий список файлов (аналогично клиенту), и получает версию до обновления.
- увеличивает номер версии на 1 (или на другой шаг)
- рекурсивно сканирует указанную ему папку.
- у всех новых файлов и файлов, которые не совпадают (аналогично клиенту) записываются новые размеры, хеши и текущая версия.
- обновленный список пишется в файл.

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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Эроласт
сообщение 14 Aug 2012, 21:37 (Сообщение отредактировал Erolast - 14 Aug 2012, 21:39)
Сообщение #5

Зануда
Сообщений: 2 236
Спасибо сказали: 2894 раза




Цитата
Даты могут врать (как на сервере, так у клиента). Не встречал ни одной программы, которая опиралась бы на даты в обновлениях.

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

Да... СанитДарк, предлагаю сделать две галочки "запрашивать обновления" и "обновлять автоматически" в найстроках, если таковые имеются - первый пункт нужен в случае если юзеру ВООБЩЕ нежелательно вылазить в интернет по каким-либо причинам, второй - если лень постоянно тыкать)
Go to the top of the pageAdd Nick
 
+Quote Post
Shurup
сообщение 14 Aug 2012, 21:45
Сообщение #6

Щирий українець
Сообщений: 1 456
Спасибо сказали: 3023 раза




Тю блин,
Цитата(Erolast @ 14 Aug 2012, 17:50) *
Затем программа заменяет дату в файле на текущую.
Вот эта строка сбила с толку.
А то, что так детально - так просто недавно похожее реализовывал, поэтому пока весь алгоритм работы помню.
Сырцами не поделюсь, ибо трудноотделимы от коммерческого проекта, но по какому-то моменту подскажу без проблем.
Go to the top of the pageAdd Nick
 
+Quote Post
SaintDark
сообщение 15 Aug 2012, 14:18
Сообщение #7

Working hard
Сообщений: 455
Спасибо сказали: 558 раз




Сам клиент в лазарус можно сделать? Основы паскаля вроде как знаю + интернет + эксперименты)

А вот с серверной частью напряг. Знаю, как вывести сообщение, ну и решение задач (я о php), а парсер не знаю как делать...

хотя напряг такой-же, как и с клиентской)


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 18 April 2024 - 16:36
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика