2.4 Escuchar paquetes UDP

Antes de que una aplicación pueda leer los paquetes UDP enviados por equipos remotos, esta debe de estar vinculada a un puerto UDP local utilizando DatagramSocket, y crear un DatagramPacket que actuará como un contenedor de datos del paquete UDP. La figura muestra la relación entre un paquete UDP, y las diferentes clases de Java utilizada para el proceso, y la aplicación real.



Escuchar_paquetes_UDP.png
Figura Nº 11: Los paquetes UDP son recibidos por un DatagramSocket y se traducen en objeto DatagramPacket.
Cuando una aplicación quiere leer los paquetes UDP, llama al método DatagramSocket.receive, que copia un paquete UDP en el DatagramPacket especifico. El contenido de la DatagramPacket es procesado y el proceso se repite según sea necesario.
El siguiente fragmento de código ilustra este proceso:
DatagramPacket packet = new DatagramPacket (new byte[256], 256);DatagramSocket socket = new DatagramSocket(2000);boolean finished = false;while (! finished ){socket.receive (packet);// process the packet}socket.close();


Cuando se procesa el paquete, la aplicación debe trabajar directamente con un array de bytes. Sin embargo, si la aplicación se adecua más a la lectura de textos, se puede utilizar las clases del paquete de Java I/O para convertir un array de bytes a otro tipo de stream o lector. Al conectar un ByteArrayInputStream con el contenido de un datagrama y luego a otro tipo de InputStream o un InputStreamReader, se puede acceder al contenido de los paquetes UDP con relativa facilidad. Muchos desarrolladores prefieren usar los stream de Java I/O para procesar data, usando un DataInputStream o un BufferedReader para acceder al contenido de las matrices de bytes.

Sin_título_3.png
Figura Nº 12: La lectura de un paquete UDP se ha simplificado mediante la aplicación de los streams de entrada.


Por ejemplo, para conectar un DataInputStream con el contenido de un DatagramPacket, el siguiente código puede ser usado :
ByteArrayInputStream bin = new ByteArrayInputStream(packet.getData() );DataInputStream din = new DataInputStream (bin);// Read the contents of the UDP packet.......


Figura_Nº_13.png
Figura Nº 13: Las estructuras de datos en los programas de emisor y receptor

El flujo del programa en el emisor y receptor
Remitente del programaCrear un socket de datagramas y vincularlo o cualquier puerto local.# Colocar la data en una matriz de bytes.
  1. Crear un paquete de datagramas, especificando la matriz de datos y la dirección del receptor.
  2. Invocar el método de envío del socket con una referencia al paquete de datagramas.
Receptor del programa# Crear un socket de datagrama y enlazarlo a un puerto local específico.
  1. Crear una matriz de bytes para la recepción de los datos.
  2. Crear un paquete de datagramas, especificando la matriz de datos.
  3. Invocar el método de recepción del socket con una referencia a los paquetes de datagramas.

back_button.gifnext_button.gif