sábado, 9 de febrero de 2013

Implementación de un Protocolo

Repositorio de Github: https://github.com/synnick/redestelcom

Descripción de la implementación:

Para el protocolo a implementar, decidí hacer un pequeño "juego" multijugador que consta de una ventana con un grid cuadrangular, con límites asignados de color gris y espacios libres asignados de color azul. En la misma ventana aparecen dos cuadros: uno rojo y uno verde los cuales pueden ser controlados por clientes que se conecten al servidor al presionar botones en sus respectivas ventanas. El cliente sabe cual cuadro es el suyo observando el color de su ventana.

Mi protocolo consta de los siguientes pasos:

Inicialización del servidor


Para que todo funcione correctamente, el programa servidor debe estar inicializado correctamente con algún puerto asignado para conexiones entrantes por parte de los clientes(por ejemplo, 8080). Se puede también proporcionar un host con una dirección IP o nombre, aunque para pruebas locales se puede omitir y se asume 'localhost' o '127.0.0.1'. Al inicializar el servidor, se generará un grid de cuadros como el mencionado previamente, colocando el rojo y el verde en lugares aleatorios(no empalmados unos con otros ni sobre cuadros grises).

Para la incialización del servidor entonces es necesario lo siguiente:

NÚMERO DE PUERTO: Ej. 8080
HOST: Ej. 127.0.0.1

Cuando el servidor se inicialice correctamente se podrá observar el grid del juego como el siguiente:



Conexión con el servidor

Para poder realizar la conexión con el servidor, un cliente debe solicitar dicha conexión al servidor, proporcionando un host y el mismo número de puerto asignado en el servidor, de no ser así la conexión se negará.

Datos necesarios para la conexión:

NÚMERO DE PUERTO: Siendo el mismo que el servidor utilizó para recibir conexiones entrantes.
NOMBRE DE HOST: Identificador que el cliente desea usar en el juego.

Lo primero que hará el programa del cliente será enviar un paquete udp al servidor para que éste sepa que un cliente se unió al juego. El paquete esta codificado en hexadecimal, y contiene la palabra 'init'.

El servidor, corriendo una subrutina de forma paralela al juego, verificara las direcciones de las conexiones entrantes y las almacenará en un diccionario, guardando tanto la direccion del cliente como el color asignado en orden de conexión(primero en conectarse rojo, segundo verde. Entonces el servidor puede saber quien envía los movimientos consultando dicho diccionario:

SOCKET DEL CLIENTE: Socket de un cliente guardado al conectarse exitosamente.
COLOR_ID: Color asignado al cliente que corresponde al cuadro que puede mover.

De ser correcta la conexión informará al cliente con un mensaje "Conexion exitosa.". El servidor por su parte imprimirá la dirección del cliente que se acaba de conectar.




Movimientos


Para poder realizar un movimiento, un cliente conectado exitosamente debe presionar el botón de movimiento deseado. El programa del cliente enviará información que indiqué la posición a la cual se moverá al servidor, codificada en hexadecimal.

El servidor podrá identificar al cliente en base a la dirección que envió la orden de movimiento, y moverá el cuadro del color correspondiente consultando el diccionario mencionado anteriormente.

ADDR: Dirección del cliente que envió la orden de movimiento para su cuadro
MOVIMIENTO: Orden de movimiento deseado.

El servidor en ese entonces verificará también si el movimiento es legal, antes de permitir el movimiento. Esto significa verificar que el cuadro no empalmará con otro o con un cuadro gris.


Animación de la implementación en funcionamiento:



Código documentado:

Cliente:



Servidor:

1 comentario:

  1. Bien. Me hubiera gustado un diagrama de secuencia o algo así. 10 pts anyhow.

    ResponderEliminar