Download Práctica 4: Programación con el protocolo UDP
Document related concepts
no text concepts found
Transcript
Práctica 4: Programación con el protocolo UDP En esta práctica se va a experimentar con la programación del protocolo UDP. Para ello, un ordenador del laboratorio está difundiendo periódicamente el código fuente de un programa mediante una secuencia de datagramas UDP y tú tienes que construir un programa en Java que capture ese código. 1. Recepción UDP Como ya se ha visto en teoría, la programación de comunicaciones con UDP se basa en las clases DatagramPacket y DatagramSocket que permiten crear un socket UDP y, posteriormente, enviar y recibir datagramas UDP sobre él. Recuerda que para poder recibir a través de un socket UDP necesitas que el socket escuche en un puerto. Para ello se crea un socket UDP mediante la orden: DatagramSocket ds = new DatagramSocket(12345); Con esto cualquier datagrama que llegue al puerto 12345 puede ser recibido mediante la orden ds.receive(p); siendo p un objeto de la clase DatagramPacket. P4-2 Prácticas de Redes de Computadores Dentro de cada datagrama encontramos un campo de datos que podemos obtener mediante el método p.getData() que devuelve un vector de bytes con los datos recibidos. El problema reside en que recibimos los datos como un vector de bytes pero necesitamos convertirlos en una cadena para poder imprimirla o compararla con otras. Existen muchas maneras de realizar esa conversión, pero es importante destacar que en esta práctica la longitud de cada datagrama no es fija, sino que depende de la longitud de cada línea de texto transmitida. Una vez se ha recibido un datagrama p, (para lo que usamos la orden ds.receive(p)), se puede conocer la longitud del datagrama recibido con la función p.getLength() que nos indica cuántos bytes tiene. En esta práctica se reciben datos que un ordenador está difundiendo (dirección de destino especial). No hay diálogo entre tu ordenador (que recibe la difusión) y el que envía los datos. Sólo tienes que recibir y para ello basta con que tu programa cree el socket UDP y se ponga a recibir. Para comprender cómo debe proceder el receptor, es necesario conocer cómo realiza el transmisor su tarea: • El transmisor envía cada línea de texto en un datagrama diferente. • Líneas de texto consecutivas se envían en datagramas conse-cutivos. • Antes de transmitir la primera línea de texto se transmite una línea conteniendo el texto “//COMIENZO” (sin las comillas). • Una vez finaliza la difusión del fichero, el proceso se repite de nuevo. • El puerto UDP al que van destinados los datagramas es el 12345. Ejercicio 1: Utilizando la orden sock comprueba que la transmisión está teniendo lugar. (Para obtener la ayuda de esta orden sock -h). Empleando esta orden, visualiza la secuencia de las líneas que se transmiten escuchando en el puerto UDP 12345. Para ello teclea sock –ul :12345 Para finalizar la orden anterior pulsa Ctrl+C. Programación con el protocolo UDP P4-3 Una vez has comprobado que, efectivamente, hay una transmisión a ese puerto, puedes comenzar a construir tu programa. Ejercicio 2: Construye un programa en Java que reciba datagramas UDP en el puerto 12345 y que muestre por pantalla lo que va recibiendo. Recuerda que al recibir un datagrama, el método getLength() perteneciente a la clase DatagramPacket te indica el tamaño real del datagrama recibido. Puesto que tu buffer es de tamaño fijo, no olvides emplear esta información para entregar solamente la cantidad de datos recibidos. Por otra parte, el constructor String(byte[] b, int offset, int length) te permite crear una cadena a partir de un vector de bytes de la longitud deseada, partiendo de una posición del vector (que en este caso es 0). Puesto que los ejercicios siguientes la pueden reutilizar, sería una buena idea encapsular las operaciones de recibir un datagrama y devolver la cadena que contiene en una función (por ejemplo: public static String recibeLinea(DatagramSocket ds)...) Una forma de conocer el tiempo que tarda en ejecutarse una orden es mediante el programa time, que precediendo a la orden a medir nos indica el tiempo que tardó ésta en ejecutarse. Probar por ejemplo con time ls. Ejercicio 3: Con el programa que acabas de realizar: 1. Ejecútalo redirigiendo la salida a un archivo (time java miPrograma > archivo) durante un minuto aproximadamente. (El tiempo transcurrido exactamente te lo indicará al final). 2. Transcurrido el minuto, finaliza el programa pulsando Ctrl+C 3. Ahora lista el contenido de tu directorio de trabajo con la orden ls –l archivo y comprueba el tamaño del archivo de salida. (Aparece expresado en bytes). 4. Calcula la velocidad de transferencia en bytes por segundo y en bits por segundo (bps). P4-4 Prácticas de Redes de Computadores La orden time nos indica el tiempo total y cómo éste se desglosa en tiempo realizando operaciones del sistema y en tiempo empleado por la aplicación. Para la práctica interesa conocer el tiempo total, que es el que se muestra en primer lugar. Si te sorprende la velocidad obtenida ten en cuenta que se ha insertado un retardo en la transmisión de cada datagrama para evitar problemas en la recepción, ya que no se están utilizando reconocimientos. Ejercicio 4: Ahora, partiendo del programa del ejercicio 2, introduce los cambios necesarios para que la recepción comience al recibir la línea apropiada (conteniendo la cadena “//COMIENZO”) descartando cualquier otra línea que le pudiera preceder, imprimiendo todas las líneas de texto recibidas después de recibir la cadena de comienzo y finalizando el proceso cuando se vuelva a recibir, por segunda vez, la cadena de comienzo. Esta última condición hará que tu programa fina-lice. Es interesante recordar que la clase String dispone de un método denominado startsWith(“texto”) que permite verificar si una cadena comienza con ese texto. Te sugerimos que tu programa imite al siguiente ejemplo en pseudocódigo: inicializa el socket UDP hacer cadena=recibe_linea(ds); mientras no cadena.comiencePor(“//COMIENZO”) hacer imprimir cadena; cadena=recibe_linea(ds); mientras no cadena.comiencePor(“//COMIENZO”) fin; Programación con el protocolo UDP P4-5 Ejercicio 5: Con el programa que acabas de realizar: 1. Ejecútalo redirigiendo la salida a un archivo (java miPrograma > Prueba.java) 2. Ahora compila el programa Prueba.java mediante la orden javac Prueba.java (si se producen errores revisa tu programa de recepción y vuelve al paso 1 de este ejercicio cuando lo hayas corregido y recibido de nuevo). 3. Ejecuta el programa que acabas de compilar, mediante la orden java Prueba y comprueba la salida que te proporciona el programa. La salida que este programa genera por pantalla te indicará si todo ha ido bien. Por último y como en prácticas anteriores hay que dejar el sistema preparado para los siguientes alumnos. Ejercicio 6: Ejecuta las siguientes órdenes para borrar tus archivos del disco: cd rm –Rf *