Estoy trabajando en un servidor de juegos genérico que administra juegos para un número arbitrario de clientes de red de socket TCP que juegan un juego. Tengo un 'diseño' pirateado junto con cinta adhesiva que funciona, pero parece frágil e inflexible. ¿Existe un patrón bien establecido sobre cómo escribir una comunicación cliente / servidor que sea robusto y flexible? (Si no, ¿cómo mejorarías lo que tengo a continuación?)
Aproximadamente tengo esto:
- Al configurar un juego, el servidor tiene un hilo para cada socket de jugador que maneja las solicitudes síncronas de un cliente y las respuestas del servidor.
- Sin embargo, una vez que el juego se está ejecutando, todos los hilos, excepto uno, duermen, y ese hilo se desplaza por todos los jugadores uno por uno y se comunica sobre su movimiento (en solicitud-respuesta invertida).
Aquí hay un diagrama de lo que tengo actualmente; haga clic para obtener una versión más grande / legible, o PDF de 66kB .
Problemas:
- Requiere que los jugadores respondan exactamente a su vez con exactamente el mensaje correcto. (Supongo que podría dejar que cada jugador responda con una mierda aleatoria y solo seguir adelante una vez que me den un movimiento válido).
- No permite a los jugadores hablar con el servidor a menos que sea su turno. (Podría hacer que el servidor les envíe actualizaciones sobre otros jugadores, pero no procesar una solicitud asincrónica).
Requisitos finales:
El rendimiento no es primordial. Esto se usará principalmente para juegos que no sean en tiempo real, y principalmente para enfrentar a las IA entre sí, no a los humanos nerviosos.
El juego siempre estará basado en turnos (incluso en una resolución muy alta). Cada jugador siempre obtiene un movimiento procesado antes de que todos los demás jugadores tengan un turno.
La implementación del servidor sucede en Ruby, si eso marca la diferencia.