Russian Qt Forum
Ноябрь 23, 2024, 20:16
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Работа с сетью
>
Автоматическое обновление клиента через интернет (по сети)
Страниц: [
1
]
2
3
4
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Автоматическое обновление клиента через интернет (по сети) (Прочитано 21402 раз)
ДвеКопейки
Гость
Автоматическое обновление клиента через интернет (по сети)
«
:
Июнь 29, 2012, 06:45 »
Всем доброго здравия!
Сразу уточню, я не самый лучший гугл мастер и возможно недостаточно хорошо гуглил свой вопрос, но адекватного описания технологий обновления ПО не нашел.
Теперь к сути:
Имеется наше ПО, которое необходимо обновлять через интернет.
Нужны рекомендации, советы, информация, где можно узнать про технологию обновления ПО, названия актуальных книг.
Как я это вижу:
1. На сервере имеется xml-файлик/запись в БД, где содержится номер актуальной версии ПО.
2. Клиент после авторизации на сервере, запрашивает актуальную версию.
3. В зависимости от разницы версий, будут скачены те или иные файлы.
*Для каждой версии в БД будут храниться свои файлы.
4. После того, как все необходимые файлы загружены, ПО предлагает перезапустить себя.
5. При завершении ПО, запускается Updater, проверяющий наличие файлов обновлений (возможно читающий xml c инструкциями)
6. Updater при завершении запускает наше ПО. Задача выполнена.
Сам код меня честно говоря не интересует.
Нужно представление о "правильности" подхода.
С удовольствием прочитаю Ваше мнение по моему вопросу.
Записан
maint
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #1 :
Июнь 29, 2012, 07:22 »
вроде здраво все. Так и делается
Записан
sidsukana
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #2 :
Июнь 29, 2012, 08:21 »
Здраво то оно здраво, у меня этот механизм реализован. Однако, апдейтер у меня тоже на Qt и он требует тот же QtCore библиотеку для работы. А если мне надо обновить библиотеки? Решил что для винды напишу апдейтер на WinAPI, но потом подумал, а нафига? Если можно просто скачивать запакованый к примеру в 7zip пакет самораспаковывающийся и запускать его. Опять же придется качать больше чем требуется. Про линукс я молчу, там либы в другом месте сидят, а тот же 7zip пакет уже не распакуется, надо чтото типа deb и rpm собирать.
Присоединяюсь к автору и тоже хотел бы узнать как сие правильно реализовать.
Записан
Bepec
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #3 :
Июнь 29, 2012, 08:35 »
Помоему всё прозрачно.
Любой самораспаковывающийся архив для обновления апдейтера.
Под виндой - тупо использовать сервер сценариев и/или батник для последующего запуска апдейтера.
Есть конечно и более долгий вариант, который использует % 80 онлайн игр - апдейтер для апдейтера
Точнее апдейтер разделён на 2 самодостаточные программы. Одна обновляет программу, вторая обновляет апдейтер. Ну и исходя из этого, последовательное их обновление не составляет труда.
PS скачивать больше, чем требуется Оо.
Это как?
В любом случае архив с обновлениями самораспаковывающийся будет весить меньше, чем архив + QtCore.dll.
Записан
sidsukana
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #4 :
Июнь 29, 2012, 09:23 »
1 - Требуется обновить только бинарник
2 - Требуется Обновить бинарник и добавить новую библиотеку
3 - Требуется сменить все библиотеки на актуальные + бинарник
Так вот в самораспаковывающийся архив в первых 2 вариантах ложить только нужные файлы? Или весь софт целиком? Никто не гарантирует что юзер не удалит предыдущую версию
В таком случае он
получит
ничего не получит при распаковке)
Если обновлять через батник, то появляется тупое черное окно, так же как и обычное Win32 приложение. Конечно его можно будет запустить через CreateProcess с нужным флагом и окно не покажется, но это гемор. Мне кажется нужно чтото типа как у FileZilla скачивание инсталятора. В моей софтине инсталятора нет, поэтому и подумал что удобней будет самораспаковывающийся архив.
Записан
Bepec
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #5 :
Июнь 29, 2012, 09:29 »
Вы хотите сказать, что не в состоянии запустить архиватор с параметрами? Оо
Апдейтер получает список файлов и их хеш. Сверяет файлы с хешем. Формирует список не совпадающих. Передаёт список на сервер. На сервере формируется архив с необходимыми файлами. Пересылка архива и его автоматическая распаковка.
Где вы нашли эти 3 пункта???
Где вы нашли в этих 3 пунктах проблему???
Где вы нашли проблему несуществующих файлов (их нет и хеша тоже нет, не так ли?
)?
А батник можно и завизуализировать и сайлентом запустить, и вообще - можно сценарием сделать.
PS а если юзер в момент загрузки отвёрткой остановит диски винчестера и написает на пилот с UPS'сом? Какие файлы будут нужны заикающемуся, со вздыбленными волосами и текущей слюной, овощу?
«
Последнее редактирование: Июнь 29, 2012, 10:06 от Bepec
»
Записан
sidsukana
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #6 :
Июнь 29, 2012, 10:37 »
Архиватор то причем? Кашу нагородили. А если нет архиватора? И зачем эти примудрости с хешем если изначально известен билд программы и на сервере хранится список тех что нужно заменить допустим?
Как нетрудно догадаться эти 3 пункта случайный набор потребностей при обновлении, не знаю на что вы с агрились.
Записан
Bepec
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #7 :
Июнь 29, 2012, 10:54 »
Разберём по деталям.
1) я не агрюсь, а спрашиваю
2) Архиватор нужен для загонки необходимых файлов в самораспаковывающийся архив.
3) Премудрости с хешем необходимы, ибо файлы твоей программы могут отсутствовать/быть повреждёнными/быть взломанными/быть другими(пользователь решил к примеру переименовать
)/и ещё куча вещей, в том числе и блокировка файлов.
Знание билда - лишь знание какой хеш брать и с чем сравнивать. А о реальном состоянии дел ты можешь узнать, только сравнив список имеющихся файлов (и их хеш) со списком файлов(и хеша), который будет прислан с сервера.
PS поверь, 30% обычных пользователей удалят пару файлов твоей программы, 40% прервут загрузку/установщик/распаковку архива, а 20% с весёлым гигиканьем словят вирус, который твои ini файлы, допустим, превратит в словарь матного языка. 9% на форс мажорные обстоятельства (полетел сектор на винте и файл что? Увы, недоступен) и 1% на волю господина рандома.
PPS самораспаковывающийся архив распаковывается ВНЕ ЗАВИСИМОСТИ от наличия на компе архиваторов. А на сервере он будет, если вы его туда поставите.
«
Последнее редактирование: Июнь 29, 2012, 10:56 от Bepec
»
Записан
ДвеКопейки
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #8 :
Июнь 29, 2012, 10:56 »
Честно говоря вариант с "апдейтером для апдейтера" мне нравится больше.
Что касается библиотек, почему бы не использовать одни и те же библиотеки?
Ведь апдейтер по сути часть программы, просто вынесенная для удобства.
Проверка существующих файлов и их контрольных сумм тоже хорошая идея спасибо, как то не подумал об этом.
Вернемся к абстракции...
Я вот все больше склоняюсь к хранению всех файлов в БД в чем то типа BLOB.
Таким образом будет 3 таблички - версии(id, version) + файлы(id,name,dirTo,dataBLOB) + смежная(version_id, file_id) или как там правильно не помню если честно...
Формирование списка файлов для загрузки получится намного проще, не придется обращаться к файловой системе а можно будет все брать прямо из БД.
Записан
sidsukana
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #9 :
Июнь 29, 2012, 11:30 »
Можешь хранить в веб директории и использовать для загрузки QNetworkAccessManager и QNetworkReply. Ну или по старинке по сокету.
Верес, ну положим у меня программа достаточно простая и работать ничего не будет, если отсутствует хоть одна библиотека. Я же могу сам при обновлении залить на сервер уже готовый архив с нужными измененными файлами и в тот же xml описание обновы и входящие в него файлы. Или там же предоставить скачать полный релиз со всей программой. Вариантов масса.
Записан
Bepec
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #10 :
Июнь 29, 2012, 11:41 »
sidsukama -мы рассматриваем все варианты. Обобщённый апдейтер так сказать.
Если каждый раз качать лишь "необходимые" по вашему билду библиотеки, то апдейтер лишится возможности восстановить программу, согласно билду.
Если залить статичные архивы, то вы будете каждый раз посылать N мегабайт клиенту. А ему нужен будет допустим 1 файл в 200 кб
У апдейтеров (нормальных) есть 3 варианта действий:
1. Обычное обновление (запрашивает обновление/устанавливает/пишет что готово или версия последняя).
2. Восстановление. Оно обычно идёт каждый раз при обновлении. Как раз проверка наличия файлов. Соответствие их хеша, закачка и восстановления структуры согласно вашему билду.
3. полное обновление - как раз качается статичный полный образ программы согласно билда.
PS а динамическое формирование архива - вещь простая как 2 пальца, и снимает сотни проблем.
Записан
Reklats
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #11 :
Июнь 29, 2012, 11:54 »
А почему бы не написать апдейтер на boost? И слинковать статически. Тогда и с либами для апдейтера париться не придётся.
Записан
Bepec
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #12 :
Июнь 29, 2012, 11:58 »
Реклатс - по секрету скажу: и на Qt можно скомпилить статически ) И на С++ и на С
Даж на С#.
Записан
Reklats
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #13 :
Июнь 29, 2012, 12:04 »
Скажу и вам по секрету, что тут свои подводные камни:
1) Лицензирование
2) Размер файла. Мне всё же кажется, что у boost будет меньше результирующий файл.
Цитата: Bepec от Июнь 29, 2012, 11:58
и на Qt можно скомпилить статически ) И на С++
Вы тут чуть чуть не правы. Вы ставите либу наравне с языками программирования.
Записан
Bepec
Гость
Re: Автоматическое обновление клиента через интернет (по сети)
«
Ответ #14 :
Июнь 29, 2012, 12:12 »
boost - это C++. Qt это С++. Найдёте разницу?
Статика вообще не нужна, если так посмотреть.
Размер тут не обсуждается. И нигде не обсуждается
2 мб или 3 мб с нашими сетями - ноу проблем.
PS если вы сторонник: "сбережём каждый бит, усечём всё что можно, запакуем чем угодно, но будет у нас вместо 3 мб - 2,99мб", то winApi. получится что-то вроде 100-200 кб.
Записан
Страниц: [
1
]
2
3
4
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...