Многопользовательская игра для Android по сети

Я программирую многопользовательскую игру для Android, которая в основном состоит из сервера, на котором клиенты подключаются и обмениваются сообщениями. Когда игрок подключается к серверу, ему / ей возвращается список игроков. Затем игрок может выбрать пользователя для вызова - конечно, он должен выбрать игрока из списка игроков, который содержит только подключенных пользователей.

Когда player1 бросает вызов игроку 2, необходимо передать сообщение от player1 на сервер, который, в свою очередь, должен отправить сообщение player2, уведомляя его о вызове. После этого player2 может принять / отклонить вызов.

Я могу использовать следующие методы, чтобы это произошло:

  1. Использовать собственный сервер / клиент с программированием сокетов Java.Сервер в основном принимает соединение от клиента, создавая новый поток для каждого подключенного клиента. Проблемы с этим заключаются в следующем:

    • Должно быть открытое постоянное соединение от клиента к серверу, расходуя заряд батареи телефона Android. Это не очень большое ограничение, так как батарея разряжается не так много.
    • Когда я захочу разработать другую игру, мне придется переписать код клиент / сервер с нуля - а также выбрать другой порт для прослушивания входящих соединений - всю концепцию довольно сложно поддерживать.
    • Я тоже волнуюсь, если это так. Создание другого потока для каждого клиента звучит довольно много, если одновременно подключаются тысячи клиентов. Но я предполагаю, что в компьютерных играх это происходит именно так. Не уверен насчет андроида.
  2. Используйте Jersey Java REST для создания клиент-серверной части поверх HTTP. Это было бы идеальным решением, если бы сервер мог легко отправлять уведомления клиентам. На самом деле здесь есть несколько дизайнерских решений:

    • клиент подтягивает сервер для любых новых данных / уведомлений каждые несколько секунд - это действительно плохо, поскольку мы застряли в отсутствии реакции, задержке и т. Д.
    • клиент может отправить ожидающий запрос на сервер, поэтому клиент получит ответ только после того, как некоторые данные станут доступны. Это лучше, но все же может возникнуть задержка, когда пользователю нужно отправить два уведомления одно за другим. Первое уведомление отправляется мгновенно, поскольку у клиента уже открыто соединение, ожидающее получения данных.Но нам придется подождать, пока клиент инициирует еще один длинный HTTP-запрос, чтобы получить второе уведомление. Проблема усугубляется тем, что существует несколько уведомлений, которые необходимо отправить подряд определенному клиенту.
    • клиент может инициировать потоковую передачу http, при этом связь остается открытой при обработке запроса, поэтому сервер также может отправлять несколько сообщений клиенту, когда он пожелает. Проблема в том, что я не знаю, насколько хорошо это работает на Android. Я просмотрел несколько реализаций:
      • Джерси Java + атмосфера: не удалось заставить его работать. Это кажется наиболее многообещающим, но я не хочу тратить на это слишком много времени, поскольку я даже не уверен, что он делает то, что я хочу.
      • Дьякон: кажется довольно аккуратным, но, посмотрев видеоурок на их официальной веб-странице, я не уверен, что он может делать то, что мне нужно. Когда player1 бросает вызов player2, может ли он отправить уведомление player2, сообщая ему о запросе совпадения?
  3. Я был бы рад узнать, как другие многопользовательские игры обрабатывают сетевую связь, если два игрока завершают игру сеть.

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

Позвольте мне также упомянуть, что я буду рад реализовать совершенно конкретный метод для работы в моем случае, так что это может быть что угодно, что выполнит свою работу, но я также ищу более общий способ связи между клиенты и сервер.Чтобы я мог программировать интерфейс / что угодно и повторно использовать код в других играх для Android, приложениях для Android.

Надеюсь, я правильно изложил проблему и получу ценные ответы.

Спасибо

7
задан eleanor 13 December 2011 в 14:08
поделиться