Atualmente, estou planejando fazer um projeto de jogo de cartas no qual os clientes se comuniquem com o servidor de maneira síncrona e baseada em turnos usando mensagens enviadas por soquetes. O problema que tenho é como lidar com o seguinte cenário:
(O cliente dá uma guinada e envia sua ação ao servidor)
O cliente envia uma mensagem informando ao servidor sua jogada no turn (por exemplo, joga o cartão 5 da mão que precisa ser colocado na mesa)
O servidor recebe mensagens e atualiza o estado do jogo (o servidor manterá todo o estado do jogo).
O servidor itera através de uma lista de clientes conectados e envia uma mensagem para informar sobre a mudança de estado
Todos os clientes são atualizados para exibir o estado
Tudo isso se baseia no uso do TCP e, agora, parece um pouco com o padrão Observer. A razão pela qual isso parece ser um problema para mim é que essa mensagem não parece ser ponto a ponto como os outros, pois eu quero enviá-la a todos os clientes e não parece muito eficiente enviando a mesma mensagem em dessa maneira.
Eu estava pensando em usar multicast com o UDP, pois assim eu poderia enviar a mensagem para todos os clientes. No entanto, isso não significa que os clientes poderiam, em teoria, ser capazes de enviar mensagens uns aos outros? É claro que também existe o aspecto síncrono, embora isso possa ser colocado no topo do UDP, eu acho.
Basicamente, eu gostaria de saber o que seria uma boa prática, já que esse projeto realmente tem tudo a ver com aprendizado, e mesmo que não seja grande o suficiente para encontrar problemas de desempenho, eu gostaria de considerá-los de qualquer maneira.
No entanto, observe que não estou interessado em usar o middleware orientado a mensagens como uma solução (tenho experiência com o uso do MOM e estou interessado em considerar outras opções, excluindo o MOM, se os soquetes TCP forem uma má idéia!).