Поэтому я пишу систему организации шахматных матчей, основанную на представлении лобби с игровыми комнатами, общим чатом и т. Д. Пока у меня есть рабочий прототип, но у меня есть большие сомнения относительно некоторых вещей, которые я сделал с сервером. Написание сервера игрового лобби для меня - новый опыт программирования, и поэтому у меня нет ни четкой, ни точной модели программирования для него. Я также не мог найти бумагу, которая описывает, как это должно работать. Я заказал «Java Network Programming 3rd edition» у Amazon и все еще жду отгрузки, надеюсь, я найду некоторые полезные примеры / информацию в этой книге.
Тем временем я хотел бы собрать ваше мнение и посмотреть, как вы справитесь с некоторыми вещами, чтобы я мог научиться правильно писать сервер. Вот несколько вопросов из головы: (может быть, еще будет)
Сначала давайте определим, что делает сервер. Его основная функция - поддерживать TCP-соединения с клиентами, слушать события, которые они генерируют, и отправлять их другим игрокам. Но есть ли что-то большее, чем это?
Должен ли я использовать один поток на клиента? Если так, 300 клиентов = 300 потоков. Не слишком ли это много? Какое оборудование необходимо для поддержки этого? А сколько пропускной способности потребляет лобби, то приблизительно?
Какую структуру данных следует использовать для хранения клиентских сокетов? Как вы защищаете его от одновременной модификации (например, игрок входит в лобби или существует в нем) при итерации по нему, чтобы отправить событие без ущерба для пропускной способности? Является ли ConcurrentHashMap правильным ответом здесь, или я должен знать некоторые методы?
Когда пользователь входит в лобби, какой механизм вы бы использовали для передачи ему состояния лобби? И пока это происходит, где всплывают другие события?
Ответы:
Моделируйте все как объекты. У вас есть чат-класс, игровая сессия, игрок ... Не создавайте новые темы для новых игроков. Вместо этого попытайтесь рассматривать каждый класс как конечный автомат: игрок может быть подключен или отключен, у него есть TcpConnection и переменная, указывающая, сколько времени у него осталось, чтобы сделать свой ход (просто в качестве примера).
Затем, когда у вас есть все ваши объекты в массиве или что-то в этом роде, вы повторяете его каждые 10 миллисекунд (число является слишком ярким примером) и предпринимаете соответствующие действия.
Например, прервать сеанс игры, если один из игроков покинул игру, отправить ходы от одного игрока другому игроку ...
Для всех событий, которые происходят в игре, вам нужно будет отправить сообщение через сеть. Создайте один дополнительный класс / перечисление, которое содержит различные типы сообщений. Если один игрок делает ход, вы можете отправить его на сервер "переход от d4 к d5" или что-то в этом роде. Если вы играете только в шахматы, вы можете отправлять строки через сеть. Для чего-то более сложного я бы посоветовал вам отправить только отдельные байты
Как правило, игровые пакеты состоят из: длины пакета, типа сообщения пакета / типа события (перемещение, присоединение к игроку, оставление игрока, ...) и содержимого (если игрок присоединяется, содержимое будет именем для пример)
источник
Чтобы ограничить количество необходимых потоков, вы должны взглянуть на Java NIO: http://en.wikipedia.org/wiki/New_I/O
источник