Я пишу игровой сервер для пошаговой игры на Java. Таковы факты:Какой протокол выбрать для пошагового игрового сервера
- Скорость игры происходит медленно, так что клиенты должны передавать данные, скажем, каждые 8 секунд, и что данные в большинстве случаев лишь небольшое инкрементального обновления (несколько десятков байт), кроме ситуаций, таких как присоединение к игре или список доступных игр и т. д.
- Сервер должен поддерживать большое количество игроков, которые, скажем, 1000, играют в одну из нескольких сотен игр.
- Когда игрок совершает поворот , другие игроки в одной игре должны быть уведомлены о движении. Максимальное количество игроков в игре около 10:
Прежде всего, я исключил UDP из своего списка опций, поскольку мне нужен надежный протокол, потому что в редких ситуациях мне действительно нужно отправить некоторые данные, которые не могут вписаться в один пакет, и я не хочу беспокоиться о слиянии пакетов и подобных вещей, отслеживая порядок прибывших пакетов и других низкоуровневых материалов.
Таким образом, возникает вопрос, следует ли использовать TCP или HTTP.
TCP попытка # 1
соединение от клиента к серверу (и наоборот) открыт все время. Таким образом, когда игрок делает ход, сервер может легко уведомить других игроков в игре, которые были сделаны. Главное, что беспокоит меня таким подходом, - это то, целесообразно или даже возможно открыть до 1000 подключений и сокетов?
TCP попытка # 2
Альтернатива, которую я думал есть, чтобы использовать, чтобы установить отдельный соединение/разъем на каждый запрос от клиента. Клиент будет открывать соединение, отправлять небольшие данные на сервер и закрывать это соединение. При таком подходе я могу иметь пул потоков фиксированного размера, допустим, 10 и обрабатывать запросы клиента в каждом потоке отдельно, чтобы в любое время было открыто не более 10 подключений/сокетов. Но есть две вещи, которые беспокоит меня с этим подходом:
- дороговизны открытия/закрытия соединения с клиентом
- способ уведомления других игроков в игре, так как связь с ними, скорее всего, закрыт , Каждый из них должен в этом случае «опросить» сервер для обновления, скажем, каждую секунду.
Какова стоимость установления сокета TCP/соединения? Это дорогостоящая операция, или это делается всего за несколько мс (или меньше)?
HTTP
- Будет ли много накладных расходов, если я бы отправить новый GET/POST просто послать несколько байт?
- Могу ли я сохранить 1000 HTTP-соединений с клиентами одновременно, а затем использовать AJAX или подобные вещи, чтобы уменьшить накладные расходы ?В этом случае было бы 1000 одновременных соединений представлять значительную проблему относительно пропускной способности/производительности?
Я открыт для предложений/советов любого рода.
о # 2: Вам нужно будет аутентифицировать игрока каждый раз, когда соединение будет установлено ... Это может быть и медленным !? – opatut
Являются ли оба клиента и сервера написанными на Java? – Kylotan
Есть несколько клиентов, один из которых находится на Java, но я ищу общее решение. – eold