2.6 Ejemplo de protocolo de datagramas de usuario
Para demostrar cómo los paquetes UDP se envían y reciben, vamos a compilar y ejecutar dos pequeños ejemplos. El primero se enlazará a un puerto local, leerá un paquete, y mostrará su contenido e información de direccionamiento. El segundo ejemplo enviará el paquete leído por el primero.
tecnologia_bigger.jpg


Cómo funciona PacketReceiveDemo
La mayoría del código se explica por sí mismo, o es similar a los fragmentos de código anterior. Sin embargo, los lectores pueden beneficiarse de un examen más detenido.

La aplicación se inicia mediante el enlace a un puerto específico, 2000. Las aplicaciones que ofrecen un servicio generalmente se enlazan a un puerto específico. Cuando actúa como un receptor, tu aplicación debe elegir un número de puerto específico, por lo que el emisor puede enviar paquetes UDP a este puerto. A continuación, la aplicación elabora un DatagramPacket para el almacenamiento de los paquetes UDP, y crea un nuevo buffer para almacenar los paquetes de datos.

DatagramSocket socket = new DatagramSocket (2000);
System.out.println ("Enlazado a un puerto local" + socket.getLocalPort ());
DatagramPacket packet = new DatagramPacket (new byte [256], 256);

Ahora la aplicación está lista para leer un paquete. La operación de lectura está bloqueando, por lo que hasta que un paquete llega, el servidor espera. Cuando un paquete es entregado con éxito a la aplicación, la información de direccionamiento para el paquete se muestra de manera que se puede determinar de dónde vino.
socket.receive (packet);
InetAddress remote_addr packet.getAddress = ();
System.out.println ("Enviado por:" + remote_addr.getHostAddress ());
System.out.println ("Enviar a:" + packet.getPort ());

Para facilitar el acceso a los contenidos del paquete UDP, la aplicación utiliza un ByteArrayInputStream para leer en el paquete. Leyendo un carácter a la vez, el programa muestra el contenido del paquete y luego termina. Tenga en cuenta que los caracteres Unicode, que son representados por algo más que un solo byte, no se pueden escribir de esta manera.
ByteArrayInputStream bin = new ByteArrayInputStream
(Packet.getData ());
for (int i = 0; i <packet.getLength (); i++){
int data = bin.read ();
if (data == -1)
break;
else
System.out.print ((char) data);
}
tecnologia_bigger.jpg



Cómo funciona PacketSendDemo
El segundo ejemplo utiliza UDP para comunicarse con el primer ejemplo. Este ejemplo actúa como el remitente, enviando un paquete UDP al receptor, que contiene un mensaje de felicitación en texto ASCII.
A pesar de que utiliza algunas clases similares (DatagramSocket, DatagramPacket), estas son empleadas de una manera ligeramente diferente.

La aplicación se inicia enlazando un socket UDP a un puerto local, que se utilizará para enviar el paquete de datos. A diferencia de la demostración del receptor, no importa que puerto local se está utilizando. De hecho, cualquier puerto libre es un candidato, y es posible que la ejecución de la aplicación varias veces resultara en números de puerto diferentes. Después de enlazarse a un puerto, el número de puerto se muestra para demostrarlo.

DatagramSocket socket = new DatagramSocket();
System.out.println ("Enlazado a Puerto local " +socket.getLocalPort());

Antes de enviar los datos, necesitamos crear un DatagramPacket. En primer lugar, unByteArrayOutputStream es utilizado para crear una secuencia de bytes. Una vez completado esto, el array de bytes se pasa al constructor DatagramPacket.

ByteArrayOutputStream bout = new ByteArrayOutputStream();
PrintStream pout = new PrintStream (bout);
pout.print ("Saludos!");
byte[] barray = bout.toByteArray();
DatagramPacket packet = new DatagramPacket( barray, barray.length );

Ahora que el paquete tiene algunos datos, necesita ser direccionado correctamente. Al igual que con un mensaje de correo, si carece de información correcta sobre la dirección no se puede entregar. Empezamos por obtener una InetAddress de la máquina remota, y luego mostrar su dirección IP. Este InetAddress es pasado al método setAddress de DatagramPacket, asegurando que llegará a la máquina correcta. Sin embargo, debemos ir un paso más allá y especificar un número de puerto. En este caso, el puerto 2000 coincide, ya que el receptor estará enlazado a ese puerto.
System.out.println ("Buscando nombre de host" + hostname);
InetAddress remote_addr = InetAddress.getByName(hostname);
System.out.println ("Nombre de host resuelto como" + remote_addr.getHostAddress());
packet.setAddress (remote_addr);
packet.setPort (2000);

El paso final, después de todo este trabajo, es enviar el paquete. Este es el paso más sencillo de todos, simplemente invocar el método de envío de DatagramSocket. Una vez más, recuerde: no hay ninguna garantía de entrega, así que es posible que un paquete se pierda en el tránsito. Una aplicación más robusta intentaría leer un acuse de recibo y reenviar el mensaje si se hubiera perdido.
socket.send(packet);


imagesCA77OK0B.jpgtecnologia_bigger.jpg






Conseguir una InetAddress para el nombre de host especificado