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 *