Actualmente estoy planeando hacer un proyecto de juego de cartas donde los clientes se comunicarán con el servidor de forma sincronizada y por turnos utilizando mensajes enviados a través de sockets. El problema que tengo es cómo manejar el siguiente escenario:
(El cliente toma el turno y envía su acción al servidor)
El cliente envía un mensaje diciéndole al servidor su movimiento para el turno (por ejemplo, juega la carta 5 de su mano que debe colocarse sobre la mesa)
El servidor recibe mensajes y actualiza el estado del juego (el servidor contendrá todo el estado del juego).
El servidor itera a través de una lista de clientes conectados y envía un mensaje para informarles sobre cambios en el estado
Todos los clientes se actualizan para mostrar el estado
Todo esto se basa en el uso de TCP, y mirándolo ahora parece un poco el patrón Observador. La razón por la que esto parece ser un problema para mí es que este mensaje no parece ser punto a punto como los demás, ya que quiero enviarlo a todos los clientes, y no parece muy eficiente enviar el mismo mensaje en de esa manera.
Estaba pensando en usar la multidifusión con UDP para poder enviar el mensaje a todos los clientes, sin embargo, ¿no significa esto que los clientes en teoría podrían enviarse mensajes entre ellos? Por supuesto, también existe el aspecto síncrono, aunque supongo que esto podría colocarse sobre el UDP.
Básicamente, me gustaría saber qué sería una buena práctica, ya que este proyecto realmente se trata de aprender, y aunque no será lo suficientemente grande como para enfrentar problemas de rendimiento, me gustaría considerarlos de todos modos.
Sin embargo, tenga en cuenta que no estoy interesado en usar middleware orientado a mensajes como solución (¡Tengo experiencia con el uso de MOM y estoy interesado en considerar otras opciones que excluyan MOM si los sockets TCP son una mala idea!).