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