Что связано с написанием лобби-сервера?


8

Поэтому я пишу систему организации шахматных матчей, основанную на представлении лобби с игровыми комнатами, общим чатом и т. Д. Пока у меня есть рабочий прототип, но у меня есть большие сомнения относительно некоторых вещей, которые я сделал с сервером. Написание сервера игрового лобби для меня - новый опыт программирования, и поэтому у меня нет ни четкой, ни точной модели программирования для него. Я также не мог найти бумагу, которая описывает, как это должно работать. Я заказал «Java Network Programming 3rd edition» у Amazon и все еще жду отгрузки, надеюсь, я найду некоторые полезные примеры / информацию в этой книге.

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

Сначала давайте определим, что делает сервер. Его основная функция - поддерживать TCP-соединения с клиентами, слушать события, которые они генерируют, и отправлять их другим игрокам. Но есть ли что-то большее, чем это?

Должен ли я использовать один поток на клиента? Если так, 300 клиентов = 300 потоков. Не слишком ли это много? Какое оборудование необходимо для поддержки этого? А сколько пропускной способности потребляет лобби, то приблизительно?

Какую структуру данных следует использовать для хранения клиентских сокетов? Как вы защищаете его от одновременной модификации (например, игрок входит в лобби или существует в нем) при итерации по нему, чтобы отправить событие без ущерба для пропускной способности? Является ли ConcurrentHashMap правильным ответом здесь, или я должен знать некоторые методы?

Когда пользователь входит в лобби, какой механизм вы бы использовали для передачи ему состояния лобби? И пока это происходит, где всплывают другие события?


300 потоков - это нормально в современной ОС, при более чем 1000 вы можете проверить другие системы, например, не подключенные.
Вальмонд,

Ответы:


3

Моделируйте все как объекты. У вас есть чат-класс, игровая сессия, игрок ... Не создавайте новые темы для новых игроков. Вместо этого попытайтесь рассматривать каждый класс как конечный автомат: игрок может быть подключен или отключен, у него есть TcpConnection и переменная, указывающая, сколько времени у него осталось, чтобы сделать свой ход (просто в качестве примера).

Затем, когда у вас есть все ваши объекты в массиве или что-то в этом роде, вы повторяете его каждые 10 миллисекунд (число является слишком ярким примером) и предпринимаете соответствующие действия.

Например, прервать сеанс игры, если один из игроков покинул игру, отправить ходы от одного игрока другому игроку ...

Для всех событий, которые происходят в игре, вам нужно будет отправить сообщение через сеть. Создайте один дополнительный класс / перечисление, которое содержит различные типы сообщений. Если один игрок делает ход, вы можете отправить его на сервер "переход от d4 к d5" или что-то в этом роде. Если вы играете только в шахматы, вы можете отправлять строки через сеть. Для чего-то более сложного я бы посоветовал вам отправить только отдельные байты

Как правило, игровые пакеты состоят из: длины пакета, типа сообщения пакета / типа события (перемещение, присоединение к игроку, оставление игрока, ...) и содержимого (если игрок присоединяется, содержимое будет именем для пример)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.