Estou trabalhando em um servidor de jogos genérico que gerencia jogos para um número arbitrário de clientes em rede de soquete TCP jogando um jogo. Eu tenho um 'design' hackeado com fita adesiva que está funcionando, mas parece frágil e inflexível. Existe um padrão bem estabelecido de como escrever a comunicação cliente / servidor robusta e flexível? (Se não, como você melhoraria o que tenho abaixo?)
Aproximadamente eu tenho isso:
- Durante a configuração de um jogo, o servidor possui um encadeamento para cada soquete do jogador que lida com solicitações síncronas de um cliente e respostas do servidor.
- No entanto, quando o jogo termina, todos os threads, exceto um sono, passam por todos os jogadores, um de cada vez, comunicando sobre sua jogada (em resposta-pedido invertida).
Aqui está um diagrama do que eu tenho atualmente; clique para uma versão maior / legível ou PDF de 66kB .
Problemas:
- Exige que os jogadores respondam exatamente por sua vez, com a mensagem certa. (Suponho que posso permitir que cada jogador responda com porcaria aleatória e só siga em frente depois que me derem uma jogada válida.)
- Não permite que os jogadores conversem com o servidor, a menos que seja a vez deles. (O servidor poderia enviar atualizações sobre outros players, mas não processar uma solicitação assíncrona.)
Requisitos finais:
O desempenho não é fundamental. Isso será usado principalmente para jogos que não são em tempo real e, principalmente, para colocar AIs uns contra os outros, e não contra humanos.
O jogo sempre será baseado em turnos (mesmo que em uma resolução muito alta). Cada jogador sempre processa uma jogada antes de todos os outros jogadores terem uma vez.
A implementação do servidor está em Ruby, se isso faz diferença.