RAI Practica2 2021T
RAI Practica2 2021T
RAI Practica2 2021T
En las dos primeras partes de la práctica, nos centraremos en la programación con sockets,
tanto orientados a la conexión como no. En la primera parte, implementaréis un programa
cliente que se comunicará con servidores UDP. En la segunda parte, programaréis un
cliente HTTP que hará peticiones a un servidor web cualquiera.
En las partes 3 y 4 de la práctica, vais a crear una API REST para hacer unos cálculos
matemáticos sencillos e intercambiaréis los datos mediante diferentes codificaciones,
incluyendo JSON.
En cada una de las partes, os entregamos un código de partida que os tiene que servir
como plantilla. Es decir, tenéis que añadir instrucciones para que funcione según se
describe en el enunciado. No podéis eliminar ninguna de las líneas de código de la plantilla,
ya que están escritas para la corrección automática de la práctica en DSLab. Tampoco
podéis copiar código de ninguna otra fuente (Internet, libros, etc.).
Veréis que hay instrucciones relativas al log, donde se registran las instrucciones que se
van ejecutando. Si queréis utilizarlas para vuestro propio control, podéis consultar un breve
tutorial en la siguiente dirección https://sd.uoc.edu/dslab/help/
Los proyectos están preparados para funcionar con Eclipse como entorno de programación
y simulación. Además, en las partes 3 y 4 será necesario el servidor Jetty. Podéis encontrar
un pequeño manual de cómo importar proyectos en Eclipse en:
Otros IDEs tienen un funcionamiento similar. Si los importáis a otro IDE, configurad los
classpath de las bibliotecas que se utilizan. También podéis compilar y probar desde la
línea de comandos del sistema operativo concreto.
Como material principal de soporte para realizar la práctica, os proponemos los siguientes
módulos, que incluyen la parte teórica y la programación en Java. Podéis encontrarlos en
el aula:
● Módulo didáctico. Mecanismos de comunicación
● Módulo didáctico. Programación de sockets en Java
● Módulo didáctico. REpresentational State Transfer (REST)
1
Redes y Aplicaciones Internet 2021-22/1
Calificación de la práctica 2
Esta práctica consta de cuatro partes. Las partes 1 y 2 son independientes. Las partes 3 y
4 están relacionadas entre ellas (la 4 es una evolución de la 3, pero es necesario entregar
las dos de forma separada). No es necesario que se realicen en orden secuencial (por
ejemplo, podéis hacer sólo la parte 1 y la parte 3). La nota irá en función de las partes
entregadas:
Para cada parte de la práctica, tenéis que entregar los códigos fuente cliente y servidor
(excepto en la parte 1 que sólo es necesario el cliente). Enviad vuestras respuestas al
registro de evaluación continua del aula de la asignatura. Usad algún programa de
compresión para hacer la entrega en un solo archivo. Nombrad el archivo:
Podéis utilizar cualquier servidor para realizar pruebas, local o remoto. No obstante, sólo
se considerará como correcta, una práctica que se haya ejecutado con resultado
satisfactorio en DSLab https://sd.uoc.edu/dslab/
Para ejecutar vuestra práctica en el entorno de corrección automático DSLab tenéis que
seguir los siguientes pasos:
2
Redes y Aplicaciones Internet 2021-22/1
En este caso, tendréis que programar tanto el cliente como el servidor, que se comunicarán
vía sockets no orientados a la conexión. El objetivo principal es que un cliente construya un
solo mapa a partir de los datos de los mapas de los demás servidores. El tipo de datos Map
se encarga de almacenar una colección de objetos, típicamente relacionando una clave
(Key) con un valor.
Después de inicializar los mapas, los servidores crean una instancia de la clase
RemoteMapUDPservidor. Esta clase es la que tenéis que modificar. Se encargará de
atender peticiones de clientes remotos, respondiendo con el valor correspondiente a la
clave concreta que le han pedido. Por ejemplo, si un cliente le pide al servidor 1 el valor
asociado a la clave k1; el servidor le enviará 11. Podéis añadir más servidores o incluso
más datos en el mapa; o dejar uno solo para hacer las pruebas iniciales. Las pruebas finales
en la corrección automática de la práctica a DSLab se harán con mapas aleatorios para
cada alumno.
3
Redes y Aplicaciones Internet 2021-22/1
de los servidores, pero cuyo contenido es la unión de los datos de todos ellos. Así pues,
siguiendo nuestro ejemplo, el mapa final del cliente tendría que contener:
Finalmente, recordad cerrar todos los sockets creados para liberar recursos del sistema.
4
Redes y Aplicaciones Internet 2021-22/1
A partir del código del fichero HTTPclient.java tenéis que programar un mini-cliente
del protocolo HTTP. Nos centraremos en la petición HEAD, que devuelve el código de
respuesta y las cabeceras HTTP, no el propio recurso, tal y como sí haría una petición GET.
Hay que tener en cuenta que al final de cada línea de la petición y la respuesta HTTP,
incluyendo las cabeceras, el estándar HTTP indica que tienen que ir los caracteres CRLF
(Carriage return y Line Feed \r\n). Si no se hace así, os fallará la corrección de
DSLab aunque el resto de datos sean correctos.
5
Redes y Aplicaciones Internet 2021-22/1
REST no tiene limitación en el formato de peticiones y respuestas (pueden ser texto, JSON,
XML, etc.). Así, para definir un servicio REST se puede definir una API indicando como se
puede pedir un recurso, incluyendo los datos que tiene que contener la petición, y dando
un ejemplo de respuesta.
En esta parte de la práctica se pide que implementéis un servicio que calcule el área de
todos los lados de un prisma cuadrangular regular. Los datos necesarios son uno de los
lados de cualquiera de sus bases y la altura.
Los ficheros a modificar son (tienen definidas las operaciones de las partes 3 y 4 de la
práctica):
RestServerAPI.java
RESTclient.java
Superficie: http://localhost:7070/prism/area/6/2
El primer número de la petición es el lado (L) y el segundo la altura (h). La respuesta tiene
que devolver un media type de tipo "text/plain".
También tenéis que implementar un programa cliente que invoque la operación del servicio
y muestre el resultado. Podéis añadir las clases cliente necesarias en el proyecto del
servidor o crear un nuevo proyecto que haga las llamadas.
6
Redes y Aplicaciones Internet 2021-22/1
En este apartado se tiene que continuar con la implementación del cliente y servidor REST.
En concreto, se pide que implementéis dos operaciones más sobre prismas en el servicio
del apartado 3: el área de la cara lateral y el volumen total. Como antes, los datos
necesarios son el lado de cualquiera de sus bases y la altura. Recordad que tenéis el
módulo didáctico REpresentational State Transfer (REST) como soporte.
Perímetro: http://localhost:7070/prism/sidearea/6/2
Volumen: http://localhost:7070/prism/volume/6/2
Volumen
V = L2 * h, donde L es el lado de una de las bases y h es la altura del prisma.
También tenéis que implementar las llamadas a estas nuevas operaciones desde el
programa cliente y mostrar el resultado.
7
Redes y Aplicaciones Internet 2021-22/1
Podéis importar directamente los archivos comprimidos que os damos, directamente desde
el archivo zip, para que os coja correctamente las librerías, ya que tienen rutas relativas. Id
al menú del Eclipse File > Import.
Os aparecerá una ventana emergente donde tenéis que seleccionar el archivo comprimido
que os hemos proporcionado, yendo a la opción Existing projects into workspace > Next >
8
Redes y Aplicaciones Internet 2021-22/1
Select Archive File, tal y como podéis ver en las dos capturas de pantalla que os mostramos
a continuación. Tras seleccionar el proyecto a cargar, podéis clicar sobre el botón Finish.
9
Redes y Aplicaciones Internet 2021-22/1
Una vez ya veis el árbol del proyecto, podéis navegar por las diferentes clases y bibliotecas
que lo componen. En vuestro caso, no tienen por qué aparecer los mismos archivos que la
pantalla que se le muestra a continuación; es sólo una referencia.
10
Redes y Aplicaciones Internet 2021-22/1
En cualquier momento, para ver el código de clientes o servidores tenéis que hacer clic
sobre la clase en el navegador de la parte izquierda de Eclipse.
Para ejecutar el proyecto, os tenéis que poner sobre la clase en cuestión, por ejemplo,
TCPclientMain y pulsar el icono verde de play ►, situado en la barra de menús superior.
También podéis hacerlo pulsando botón derecho sobre la clase que contiene el método
main dentro del explorador del proyecto, en la parte izquierda de la pantalla. El resultado
inicial que se os muestra por consola con el código de partida de la parte 2 tendría que ser
similar a la siguiente imagen:
11
Redes y Aplicaciones Internet 2021-22/1
Como la práctica os pide que haya dos servidores ejecutándose, tendréis que repetir la
misma operación dos veces. Aparecerá una pantalla donde tenéis que seleccionar el
servidor y ponerle el puerto 5836 en la primera ejecución y 5838 en la segunda. Finalmente
tenéis que aceptar y cerrar las ventanas emergentes.
12
Redes y Aplicaciones Internet 2021-22/1
Si deseáis ver diferentes consolas, es decir, los mensajes que cualquiera de los servidores
o el cliente os van mostrando por pantalla a lo largo de su ejecución, tenéis que utilizar el
botón para cambio de consola en la parte inferior derecha del Eclipse:
El resultado inicial que se os muestra por consola con el código de partida de la parte 1 de
los servidores tendría que ser similar a la siguiente imagen:
13
Redes y Aplicaciones Internet 2021-22/1
14
Redes y Aplicaciones Internet 2021-22/1
Extrae del zip el directorio lib entero en una carpeta de vuestra máquina (puede ser en
el proyecto Eclipse). Después, desde la ventana JAR selection, selecciona todas las
librerías que hay en este directorio. Los errores de dependencias deberían desaparecer.
15
Redes y Aplicaciones Internet 2021-22/1
3. Una vez instalado y compilado el proyecto, ya se puede ejecutar. Tenéis que seleccionar
la opción Java Application. Si os pregunta con qué clase, buscad RESTserverMain o
RESTclient. Primero se tiene que poner en marcha el servidor.
16
Redes y Aplicaciones Internet 2021-22/1
17