Diseño Del Modulo De Comunicaciones
ComunicacionesComunUML.png

Descripción

El módulo de comunicaciones se encarga de facilitar el envio y recepción de mensajes entre el programa servidor (y sus módulos) y los clientes. Además expone funcionalidades para la identificación de usuarios asi como para la obtención/modificación de los datos de estos.

Dependencias

Módulo de Base de Datos

Usado para tareas de identificación y consultas de usuarios

Módulo de Log

Usado para notificar errores graves del sistema

QuickServer

Base de comunicaciones del servidor

XStream

Utilidad de serialización(necesario tambien para el cliente)

Empaquetado

La implementación del módulo está en el fichero ModuloComunicaciones.jar mientras que los interfaces y clases usables por otros modulos o aplicaciones se encuentran en ModuloComunicacionesComun.jar.

Uso del módulo

Uso del módulo desde otros módulos

Lo primero es obtener una instancia de IModuloComunicaciones mediante una llamada a IGestorModulos.obtenerInstanciaModulo("Comunicaciones"). A partir de aqui se pueden usar los métodos definidos en la interfaz que pasamos a detallar:

IModuloComunicaciones

  • public void registrarProtocolo(int idProtocolo,IReceptorEventosComunicaciones receptor)

Incluye en la lista de observadores para el protocolo idProtocolo el IReceptorEventosComunicaciones receptor, para que este pueda recibir los eventos generales del módulo comunicaciones asi como los especificos de ese protocolo.

  • public void desregistrarProtocolo(int idProtocolo,IReceptorEventosComunicaciones receptor)

Elimina un IReceptorEventosComunicaciones de la lista de receptores del protocolo especificado

  • public void enviarMensaje(int idProtocolo,int idCliente,String comando,Object datos)

Envia un mensaje al cliente indicado

  • public void enviarMensaje(int idCliente,Mensaje msg)

Envia un mensaje al cliente indicado

  • public Usuario getUsuario(int idCliente)

Permite ontener un Usuario conectado dado un identificador de cliente

  • public Usuario getUsuario(String apodo)

Permite ontener un Usuario conectado dado un apodo de cliente


Los eventos del módulo de comunicaciones los procesan observadores, que son instancias de IReceptorEventosComunicaciones, los métodos que debe implementar un posible observador son:

IReceptorEventosComunicaciones

  • public void mensajeRecibido(int idCliente,Mensaje msg)

Metodo que es llamado por el modulo de comunicaciones cuando a éste le llega un mensaje destinado a un protocolo para el cual se ha registrado previamente la instancia actual de IReceptorEventosComunicaciones. Es importante que este método termine lo antes posible y que bajo ningun concepto provoque envio de datos de forma directa o indirecta (hay peligro de reentrada en el thread que podría provocar el cuelgue del módulo de comunicaciones), por ello se recomienda guardar el mensaje en alguna estructura apropiada (p.e. una cola) que sea procesada desde un hilo aparte.

  • public void usuarioDesconectado(int idCliente)

Metodo que es llamado por el módulo de comunicaciones cuando un usuario se desconecta del sistema. Conviene tener en cuenta que una vez se ha disparado este evento no se puede obtener una instancia de Usuario a partir de idCliente, por lo que si es necesario acceder a datos del usuario despues de su desconexión habrá que crear una instancia por su apodo o tenerla almacenada previamente.


Para la gestión de usuarios los módulos que usen el de comunicaciones pueden obtener instancias de la clase Usuario que proveen de todo lo necesario para la consulta/modificacion de los datos de los jugadores.

Usuario

Responsabilidad

La clase es responsable de transformar las peticiones o modificaciones de datos de un usuario en llamadas a la base de datos. También comprueba la validez de los credenciales proporcionados por un cliente.

Dependencias

  • IModuloBaseDatos: Para acceso a los datos.
  • IModuloLog: Para la notificación de problemas.
  • Sentencia: Como empaquetamiento de consultas SQL.

Métodos

  • public Usuario(String identificador,IModuloBaseDatos bd) throws Exception

Crea una instancia de la clase Usuario a partir de una cadena de texto que representa su nombre de usuario y contraseña e intenta identificarlo contra la base de datos, lanzando una excepcion si no se puede

  • public Usuario(String nombre)

Crea un usuario para facilitar la consulta de datos sobre el mismo

  • public static void stIniciaLog(IModuloLog ml)

Asigna el modulo de log que va a ser usado por las instancias de Usuario

  • public static Usuario stGetUsuario(String nombre)

Obtiene la instancia de un Usuario conectado al sistema con el nombre indicado

  • public static boolean stNuevoUsuario(Usuario u)

Permite añadir un Usuario a la coleccion de usuarios conectados(No debe ser usado desde fuera del módulo comunicaciones).

  • public int getPuntos(String nombreJuego, IModuloBaseDatos bd)

Permite acceder a los puntos del Usuario para un juego dado

  • public boolean setPuntos(String nombreJuego, IModuloBaseDatos bd, int puntos)

Permite actualizar los puntos del Usuario para un juego dado

  • public boolean anadePuntos(String nombreJuego, IModuloBaseDatos bd, int puntos)

Incrementa los puntos del Usuario para un juego dado ya sea positivamente o negativamente

  • public String getNombre()

Devuelve el nombre del Usuario

  • public int[] dameLogros (String nombreJuego, IModuloBaseDatos bd)

Permite acceder a los logros del Usuario para un juego dado

  • public boolean anadeLogro (String nombreJuego, IModuloBaseDatos bd, int logro)

Permite añadir nuevos logros para el Usuario y el juego indicado

  • public boolean quitaLogro (String nombreJuego, IModuloBaseDatos bd, int logro)

Permite quitarle a un Usuario algun logro del juego indicado

  • public String[] dameListaAmigos(IModuloBaseDatos bd)

Permite obtener una lista de amigos para el Usuario

  • public boolean anadeAmigo (String amigo, IModuloBaseDatos bd)

Añade un amigo a la lista de amigos del Usuario

  • public boolean quitaAmigo (String amigo, IModuloBaseDatos md)

Quita un amigo de la lista de amigos de Usuario


La unidad minima de informacion que transmite el módulo de comunicaciones es el mensaje, que pasamos a detallar:

Mensaje

Responsabilidad

Actua como clase contenedora para los datos y metadatos que se envian en cualquiera de las dos direciones entre cliente y servidor. Por tanto esta clase la deben usar tanto los modulos de servidor como los del cliente

Dependencias

  • XStream: Para serializar el contenido del mensaje a una cadena de bytes

Métodos

  • public Mensaje(MetaDatos metadatos,Object datos)

Crea un nuevo mensaje dados unos datos y unos metadatos

  • public MetaDatos getMetadatos()

Permite obtener los metadatos del mensaje

  • public Object getDatos()

Permite obtener los datos del mensaje

  • public byte[] serializa(XStream xs)

Convierte el mensaje en una cadena de bytes para poderlo enviar


Metadatos

Responsabilidad

Es la clase responsable de contener informacion sobre los datos y el mensaje. Se puede heredar de esta clase si se desea añadir mas funcionalidad

Dependencias

Metodos

  • public MetaDatos(int idProtocolo,String comando)

Dado un protocolo y un comando crea un Metadato

  • public int getIdProtocolo()

Permite obtener el número identificador del protocolo

  • public String getComando()

Permite obtener el comando que contiene Metadatos


ReconstructorMensajes

Responsabilidades

Reconstruir instancia de mensajes que le llegan como una secuencia de bytes. Se usa internamente en el módulo comunicaciones y la pueden usar los clientes que deseen comunicarse con este.

Dependencias

  • XStream: Para la deserializacion de los mensajes

Metodos

  • public boolean nuevoFragmento(byte[] fragmento)

Añade al bufer de fragmentos un conjunto de bytes recibidos generando con ellos si es posible un nuevo Mensaje

  • public boolean hayMensajes()

Determina si hay Mensajes en la cola de mensajes

  • public Mensaje damePrimerMensaje()

Devuelve el primer Mensaje de la cola de mensajes

  • public void eliminaPrimerMensaje()

Elimina el primer Mensaje de la cola de mensajes

Uso desde la aplicación

Las aplicaciones que desen comunicarse con el servidor han de incluir una referencia al fichero ModuloComunicacionesComun.jar para poder usar las clase Mensaje, Metadatos y ReconstructorMensaje. Este fichero no incluye implementacion alguna de un sistema de sockets por lo que, corre a cargo del implementador de la aplicacion, preparar todo lo necesario para establecer la conexion

Secuencia de una comunicación

ComunicacionesSencuenciaUML.png