• Какова правильная логика обновления клиента игры?

    @Sing303
    Патчи
    - Не эффективно
    - Слишком сложно, чревато ошибками
    - Усложнится поддержка и скорость выпуска патча, его тестирование

    Как можно сделать (упрощённая схема)
    1. Получаем с сервера список файлов и их хешей (всех)
    2. Проверяем есть ли у пользователя все эти файлы (если хеш не корректен, считаем что файла нет)
    3. Закачиваем по 1 запакованному файлу с сервера (не архив со всеми файлами, а именно по одному)
    4. Распаковываем файлы, с заменой
    5. Наслаждаемся обновлённой версией

    Можно не считать хеш постоянно, а сохранять значение хеша локально и если дата файла изменилась, тогда считать хеш снова.
    Данная схема очень проста, нет никаких патчей, качаются только те файлы, которые нужны, не нужно даже хранить номер версии, т.к. проверка по файлам.
    Ответ написан
    1 комментарий
  • Какова правильная логика обновления клиента игры?

    VGrabko
    @VGrabko
    Golang, Php, Js
    Сервер отдаёт файл в котором указана дата последнего изменения отнсительно часового пояса юзера.

    Юзер проверяет дату изменения файлов. И пишет их в массив
    Юзер шлёт массив "не совпавших дат" и сервер в ответ отдаёт json с хешами для файлов

    Потом проверяем хеши для этих файлов (в друг с часовым поясом намутили)
    И если изменился загружаем (или даём серверу их список и он генерит в ответ архив с изменёнными файлами)
    Ответ написан
    Комментировать
  • Какова правильная логика обновления клиента игры?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Есть версия и есть хеш-сумма текущей версии всех данных приложения (файлы + БД).
    При запуске - проверяются оба значения.
    При несоответствии - выполняется операция синхронизации:
    1. Выявление различий
    2. Подготовка списка изменений относительно текущей версии у пользователя
    3. Резервирование текущей версии пользователя
    4. Загрузка всех необходимых файлов на устройство пользователя. (с возможностью докачки при разрыве соединения)
    5. Выполнение изменений.
    6. Проверка сделанных изменений (п.1)
    7. Удаление резервной копии (созданную в п.3)
    При прерывании любого из пунктов (сел аккумулятор у ПК или смартфона и прочее) - всегда должна быть возможность продолжить обновление с прерванного шага.
    Ответ написан
    Комментировать
  • Какова правильная логика обновления клиента игры?

    @Neonoviiwolf
    Flutter developer
    Сервак сообщает актуальную версию программы, если нет совпадения, то сбрасывает хеш всех файлов новой версии программы, дальше программа на стороне клиента обходит рекурсивно каждый файл и сравнивает хеш, если не совпадает/не находит, качает с сервера. После полной загрузки обновления, изменяет версию ПО.
    Тут вам и лишний ничего не скачает без необходимости, решит проблему обрывов соединения и решит проблему в случаи утраты/удаления/подмены файлов
    Ответ написан
    2 комментария
  • Какова правильная логика обновления клиента игры?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Из личного опыта: imho самое правильное это иметь неразрывную цепочку обновлений с первой версии до текущей, т.е 1>2, 2>3, 3>4 итд.
    Периодически для чистой установки выпускать мажорные версии, - но при этом все равно иметь неразрывную цепочку обновлений.

    Делать патчи вида 1>4, 2>4 итд - по моему опыту архи неправильно, т.к создает огромные риски неявных багов + затраты на сборку таких патчей.

    По факту для пользователя нет проблемы установить много обновлений.

    Будет осуществляться проверка на то, какая из блоков цифр в версии отличается.
    Это Вы какие то мелкие частности обсуждаете.

    Как у них осуществляется проверка наличия даже самого ненужного файла? Удалил файл из каталога, а он берет и докачивает его. Проверяет перед запуском все каталоги на время изменения и сравнивает с серверными?

    Вопрос третий: Насколько эффективно будет сравнивать время изменения каталогов у пользователя и сравнивать с серверными? Ведь если даже в самой глубокой директории был изменен/удален/создан файл, то самый верхний по иерархии каталог будет иметь дату изменения ту, когда был затронут файл. Соответственно, таким образом можно избежать большого количества рекурсивных проверок.
    И, соответственно, обновиться будет проще. Удаляем измененный каталог и закачиваем заново.
    Привязываться к дате изменений - не лучшая идея. Проверка обходит каталоги рекурсивно, сравнивает не только список файлов но и их хеши. Почитайте как работает dropbox/яндекс.диск, да тот же торрент наконец
    Ответ написан
    4 комментария
  • Какова правильная логика обновления клиента игры?

    @Alexander1705
    Честно говоря, я с этим не сталкивался, но я бы попробовал сделать так:
    Допустим, мы выпускаем новую версию - 2.46. При этом на сервер мы заливаем полную версию для чистой установки или для обновления с очень старых версий, и делаем n-ное количество патчей 2.45to2.46, 2.44to2.46, 2.43to2.46... Так, если пользователь отстаёт на несколько версий, он просто загрузит минимально необходимую разницу между его версией и актуальной, если же у пользователя очень старая версия, он скачивает заново весь клиент.
    Таким образом минимизируется количество загрузок для пользователя, а следовательно уменьшится нагрузка и на сервер.
    Ответ написан
    2 комментария
  • Как привязать доменные имена к страницам?

    @Arik
    К хосту что определяет страницы (user1.website.ru) указать default_server
    nginx.org/ru/docs/http/request_processing.html

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

    Юзер надо лишь указать IP вашего сервера или лучше CNAME, вдруг у вас переезд будет
    Ответ написан
    1 комментарий
  • Что быстрей file_get_contents | Sockets | cURL?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    разница в пределах погрешности, все три варианта используют сокеты так или иначе и упретесь вы I/O тех самых сокетов.
    Ответ написан
    1 комментарий
  • Как использовать json массив в C#, получаемый через WebRequests?

    arxont
    @arxont
    C# программист
    Как-то так -
    static void Main()
    {
      var afterWebRequests = "{\"items\":[{\"key\":1,\"val\":\"one\"},{\"key\":2,\"val\":\"two\"},{\"key\":3,\"val\":\"three\"},{\"key\":4,\"val\":\"four\"}]}";
      var temp = (MyArray)JsonConvert.DeserializeObject(afterWebRequests, typeof(MyArray));
    
      foreach(Item item in temp.items)
      {
        Console.WriteLine("Key: {0}, Value {1}", item.key, item.val);
      }
      Console.ReadKey();
    }
    
    public class MyArray
    {
      public List<Item> items { get; set; }
    }
    
    public class Item
    {
      public int key { get; set; }
      public string val { get; set; }
    }
    Ответ написан
    1 комментарий
  • Как использовать json массив в C#, получаемый через WebRequests?

    @dmitryKovalskiy
    программист средней руки
    stackoverflow.com/questions/17038810/newtonsoft-js... Собственно и название нужной библиотеки и пример использования для вашей задачи.
    Ответ написан
    6 комментариев
  • Как скормить php-fpm bash скрипт?

    svfat
    @svfat
    ☺Нужен VPS? Два месяца бесплатно. Смотри профиль☺
    Просто запустить можно с помощью HttpLuaModule
    location / {
      content_by_lua 'os.execute("/var/www/cgi-bin/script.sh")';
    }

    Или использовать через CGI с помощью fastcgiwrap и spawn-fcgi
    Ответ написан
    2 комментария
  • Как расшарить интернет в туннель PPTP?

    @dobryshkin
    Обозначения
    $EXT_R_IP - внешний IP роутера
    $LOCAL_IP - внутренний "фэйковый" адрес машины, которую надо "выкидывать" наружу
    $PORT1 - Порт, на который будут заходить извне и попадать на локальную машину
    $PORT2 - Порт, который "выбрасывается" наружу(например, 80 - http, либо 21 - ftp)


    На роутере говорим следующие команды(от рута)

    # iptables -t nat -A PREROUTING -p tcp -d $EXT_R_IP --dport $PORT1 -j DNAT --to-destination $LOCAL_IP:$PORT2
    # iptables -A FORWARD -i eth0 -d $LOCAL_IP -p tcp --dport $PORT2 -j ACCEPT
    Ответ написан
    7 комментариев
  • Безопасен ли такой код?

    nowm
    @nowm
    Да, в принципе, вполне безопасен. Здесь вы не вызываете никакой пользовательский код. $controller у вас вызывается ваш, который вы вручную прописывали внутри массива $routes.
    Ответ написан
    Комментировать
  • Как защитить авторские права на статью или другую собственность в сети интернет?

    Для защиты текстов от воровства попробуйте сервис: http://CopyWatcher.com/ - система автоматического мониторинга авторского текста на плагиат со встроенными инструментами для возможного устранения найденного плагиата из поисковой системы Google.
    Для доказательства своего авторства рекомендую сервис: http://CopyTrust.ru/ - Сервис предоставляет техническую возможность зафиксировать факт существования данных в цифровой форме на определенные дату и время.
    Ответ написан
    Комментировать
  • Нетривиальная задача. Как подключить к сайту несколько авторизаций?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Используйте uLogin или аналоги, там через api можно узнавать, через что авторизовывался пользователь.
    Ответ написан
    Комментировать
  • Почему подвисает Wi-Fi на пару секунд?

    iPharaon
    @iPharaon
    У вас случайно в ноутбуке WiFi адаптер не от Intel? У них на частоте 2,4 ГГц с шириной полосы 40 МГц наблюдаются данные проблемы, а именно - пропадает соединение на несколько секунд. Проблема решается поиском нужного драйвера (я не искал), переходом на ширину полосы 20 МГц или переход на частоту 5 ГГц (мой случай).
    Ответ написан
    2 комментария