многопользовательская игра для Android по сети - PullRequest
7 голосов
/ 13 декабря 2011

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

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

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

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

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

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

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

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

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

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Вы должны взглянуть на XMPP.Это протокол (изначально созданный для программ чата), который позволяет отправлять XML-данные между пользователями.
Он имеет отдельные отношения клиент-сервер, так что вы можете сосредоточиться на разработке клиентского приложения, подходящего для телефонов и другого сервера в зависимости отна ваши нужды.

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

aSmack - библиотека для создания xmpp-клиентов Android.Требуется некоторая настройка, чтобы настроить его и заставить все работать, но как только вы это сделаете, это будет аккуратно.

РЕДАКТИРОВАТЬ: относительно ответа, предлагающего использовать C2DM:
из c2dm docs "Отправка большого количества сообщений C2DM" :

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

0 голосов
/ 13 декабря 2011

Я бы проголосовал за какую-нибудь технику передачи сообщений - например, activeMQ, rabbitMQ, zeroMQ или что-то в этом роде. На стороне сервера вы можете придерживаться java или javascript (например,
node.js) - такое решение обеспечит большую производительность и минимальные задержки.

Если задержка не так важна, вы также можете использовать вызовы REST с JSON

0 голосов
/ 13 декабря 2011

Звучит как Android Обмен сообщениями между облаками и устройствами может быть тем, что вам нужно

Push-уведомления без необходимости держать соединение открытым

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...