Partida - Protocolo

Introducción

Este protocolo abarca las comunicaciones básicas entre un jugador de una partida y el servidor de dicha partida. Este protocolo se apoya en el protocolo del módulo de juegos, que es el que se encarga de crear las partidas y de añadir jugadores a éstas.

Descripción

El protocolo de la partida comunica todos los clientes de una partida (los jugadores) con el servidor, lo cual requiere que los clientes ya pertenezcan a la partida correspondiente, de lo cual se encarga el protocolo del módulo de juegos.
Este protocolo tiene diferentes utilidades:

Notificación de incorporación

Informa a los clientes que ya están en la partida de la incorporación de un juevo jugador.

Solicitud / notificación de cambio de turno

Un cliente puede solicitar que el turno pase al siguiente jugador (en el orden que corresponda según el juego). El servidor comprueba si el cliente que solicitó el cambio estuviese en posesión del turno y, a continuación, informa a todos los clientes de quién es el nuevo poseedor del turno.

Solicitud / notificación de inicio de la partida

Según el juego, uno o más clientes tendrán la capacidad de iniciar la partida. El cliente que desee iniciar la partida envía una solicitud que será comprobada por el servidor. Una vez iniciada la partida, se informa a todos los clientes del inicio, notificando a quién corresponde el primer turno.

Notificación de abandono

Informa a los clientes que continúan en la partida que un jugador ha abandonado.

Notificación de final de la partida

Informa a los clientes que la partida ha concluido.

Implementación

Los mensajes que envía la partida abstracta son objetos de la clase MensajePartida. Estos objetos contienen un String que describe el tipo de evento (definido por el usuario, con una excepción) y unos datos (también definidos por el usuario).
Los mensajes que pertenecen al protocolo de la partida tienen como evento la cadena control, que está reservada para el protocolo y no puede ser usada por los usuarios. En este caso, el dato del mensaje es un objeto de la clase ControlDePartida.
La clase ControlDePartida contiene tres campos: usuario, accion e info. El contenido de estos campos se detalla en la siguiente tabla:

Acción Sentido accion usuario info
Notificación de incorporación Servidor a uno o más clientes INCORPORACION Nombre del usuario incorporado Boolean indicando si es un observador
Solicitud de cambio de turno Cliente a servidor FIN_DE_TURNO null null
Notificación de cambio de turno Servidor a todos los clientes FIN_DE_TURNO Nombre del usuario que está en posesión del turno tras el cambio null
Solicitud de inicio de la partida Cliente a servidor INICIO_PARTIDA null null
Notificación de inicio de la partida Servidor a todos los clientes INICIO_PARTIDA Nombre del usuario que está en posesión del primer turno null
Notificación de abandono Servidor a todos los clientes ABANDONO Nombre del usuario que abandona null
Notificación de fin de la partida Servidor a todos los clientes FINALIZACION null null

Nota: en raras ocasiones puede ocurrir que el servidor envíe una notificación de incorporación duplicada. Como el nombre de usuario es único, es fácil filtrar las notificaciones redundantes e ignorarlas.