Я работаю над общим игровым сервером, который управляет играми для произвольного числа клиентов, подключенных к TCP-сокету. У меня есть «дизайн», взломанный вместе с клейкой лентой, который работает, но кажется хрупким и негибким. Существует ли устоявшаяся модель для написания надежных и гибких коммуникаций между клиентом и сервером? (Если нет, как бы вы улучшили то, что у меня ниже?)
Примерно у меня есть это:
- При настройке игры сервер имеет один поток для каждого сокета игрока, обрабатывающий синхронные запросы от клиента и ответы от сервера.
- Однако, как только игра начнется, все потоки, за исключением одного сна, будут проходить циклически по всем игрокам, сообщая об их движении (в обратном запросе-ответе).
Вот схема того, что я имею в настоящее время; щелкните для увеличения / читаемой версии, или PDF на 66 КБ .
Проблемы:
- Это требует, чтобы игроки отвечали точно по очереди с точно правильным сообщением. (Полагаю, я мог позволить каждому игроку отвечать случайным дерьмом и двигаться дальше только после того, как он даст мне правильный ход.)
- Это не позволяет игрокам общаться с сервером, если только не их очередь. (Я мог бы заставить сервер отправлять им обновления о других игроках, но не обрабатывать асинхронный запрос.)
Окончательные требования:
Производительность не имеет первостепенного значения. Это будет в основном использоваться для игр не в реальном времени, и в основном для противостояния ИИ друг против друга, а не раздражительных людей.
Игра всегда будет пошаговой (даже в очень высоком разрешении). Каждый игрок всегда получает один ход, прежде чем все остальные игроки получают ход.
Реализация сервера происходит в Ruby, если это имеет значение.