Sto lavorando su un server di gioco generico che gestisce i giochi per un numero arbitrario di client TCP collegati in rete durante una partita. Ho un "design" hackerato con un nastro isolante che funziona, ma sembra fragile e non flessibile. Esiste un modello consolidato per la scrittura di comunicazioni client / server che sia solido e flessibile? (In caso contrario, come miglioreresti quello che ho di seguito?)
All'incirca ho questo:
- Durante l'impostazione di un gioco, il server ha un thread per ogni socket del giocatore che gestisce le richieste sincrone da un client e le risposte dal server.
- Una volta che il gioco procede, tuttavia, tutti i thread tranne un sonno, e quel thread scorre tutti i giocatori uno alla volta comunicando la loro mossa (in una richiesta-risposta inversa).
Ecco un diagramma di quello che ho attualmente; fare clic per una versione più grande / leggibile o PDF da 66 kB .
I problemi:
- Richiede ai giocatori di rispondere esattamente a turno con esattamente il messaggio giusto. (Suppongo che potrei lasciare che ogni giocatore risponda con una merda casuale e andare avanti solo quando mi danno una mossa valida.)
- Non consente ai giocatori di parlare con il server a meno che non sia il loro turno. (Potrei avere il server inviare loro aggiornamenti su altri giocatori, ma non elaborare una richiesta asincrona.)
Requisiti finali:
Le prestazioni non sono fondamentali. Questo sarà usato principalmente per i giochi non in tempo reale, e principalmente per mettere gli IA l'uno contro l'altro, non per gli umani nervosi.
Il gioco sarà sempre a turni (anche se con una risoluzione molto alta). Ogni giocatore ottiene sempre una mossa elaborata prima che tutti gli altri giocatori facciano un turno.
L'implementazione del server sembra essere in Ruby, se questo fa la differenza.