En redes de datos, se le conoce como comunicación no fiable,
aquella que no proporciona mecanismos de aseguramiento de la entrega y recuperación de errores.
Este tipo de comunicación se implementa en aplicaciones donde la reducción de
la latencia tiene mayor impacto que la tasa de pérdidas, por ejemplo, en la
transmisión de audio.
Por otra parte, la comunicación a nivel de procesos, puede
adquirir la forma de unidifusión y multidifusión. En esta última, un proceso
puede enviar un mensaje a varios receptores a la vez. Para ello, dichos
receptores deben estar adheridos a un grupo.
A nivel de la capa de red del modelo TCP/IP, la
multidifusión cuenta con sus propias direcciones, que en versión IPv4 se ubican
dentro del rango 224-239. Mediante estas direcciones es posible identificar un
grupo para comunicación entre sus miembros.
El objetivo del siguiente programa será verificar el papel de
dos elementos que intervienen en este tipo de comunicación: El puerto y la
dirección. Para ello utilizaremos dos
programas.
Fuente.java: Envía un mensaje a una dirección de multicast
(grupo) en un puerto específico. Su funcionamiento se resume en los siguientes
pasos:
- Obtener dirección multicast
- Generar mensaje en forma de datagrama UDP
- Enviar mensaje al grupo y puerto designado
Destino.java: Este código se ejecuta en forma de dos
procesos que se adhieren a una dirección de multicast y por tanto, reciben el mensaje
enviado por la fuente. Su funcionamiento se resume en los siguientes pasos:
- Obtener dirección multicast
- Unirse al grupo del multicast
- Leer mensaje en forma de datagrama UDP
Las acciones anteriormente descritas se han colocado en un
ciclo infinito tanto en fuente.java como en destino.java de tal forma que los
procesos destinos no terminen hasta que reciban un mensaje como miembros del
mismo grupo multicast.
Fuente.java
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
/**
*
* @author Joaquin
Bolaños
*
* Envía un mensaje a
una dirección de multidifusión utilizando un puerto UDP
* El tipo de
comunicación es no fiable.
*
* Dirección multicast
del grupo: 230.2.2.5
* Puerto UDP
(socket): 1234
*
*/
public class Emisor {
public static void
main(String[] args) {
MulticastSocket puerto; // Clase para el socket multicast
InetAddress
grupo; // Clase para el grupo
System.out.println("EMISOR");
try{
while(true)
{
//
Estableciendo el grupo con una dirección multicast
// y
asociando el puerto UDP al socket multicast.
grupo
= InetAddress.getByName("230.2.2.5");
puerto
= new MulticastSocket(1234);
String
mensaje = "Mensaje para el grupo";
DatagramPacket paquete = new DatagramPacket(mensaje.getBytes(),
mensaje.length(), grupo, 1234);
puerto.send(paquete);
}
puerto.close(); // Cierra la conexión.
}
catch(Exception
ex)
{
System.out.println("" + ex.getMessage());
}
}
}
Destino.java
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
/**
*
* @author Joaquin
Bolaños
*
* Envía un mensaje a
una dirección de multidifusión utilizando un puerto UDP
* El tipo de
comunicación es no fiable.
*
* Dirección multicast
del grupo: 230.2.2.5
* Puerto UDP
(socket): 1234
*
*/
public class Receptor {
public static void
main(String[] args) {
MulticastSocket puerto;
InetAddress
grupo;
System.out.println("RECEPTOR");
try
{
while(true)
{
//
Estableciendo el grupo con una dirección multicast
// Asociando el puerto UDP al socket
multicast.
//
Finalmente se une al grupo con el método joinGroup
grupo
= InetAddress.getByName("230.2.2.5");
puerto
= new MulticastSocket(1234);
puerto.joinGroup(grupo);
//
Buffer para guardar el mensaje que llega al grupo.
byte[]
almacen = new byte[100];
if
(almacen.length != 0) // Si ha llegado un mensaje nuevo
{
//
Crea datagrama UDP para el mensaje
DatagramPacket recibido = new DatagramPacket(almacen, almacen.length);
//Lee el mensaje que le llega.
puerto.receive(recibido);
//
Lo muestra en pantalla
System.out.println(new String(almacen));
break;
}
}
puerto.close(); // Cierra la conexión
}
catch
(Exception ex)
{
System.out.println("" + ex.getMessage());
}
}
}
A continuación, se muestra la ejecución de un proceso fuente
y dos procesos destino en los siguientes casos:
Caso 1: La dirección de multicast y el número de puerto coincide tanto
en la fuente como en los destinos.
Resultado: Ambos procesos destino que pertenecen al mismo
grupo reciben el mensaje
Emisor:
Proceso receptor 1:
Proceso receptor 2:
Caso 2: La dirección de multicast coincide tanto en la
fuente como en los destinos; pero no el número de puerto.
Resultado: Aunque ambos procesos pertenecen al mismo grupo,
el “buzón de entrada” no coincide, por lo que no leen el mensaje ni tampoco lo
muestran.
Emisor:
Proceso receptor 1:
Proceso receptor 2:
Caso 3: El número de puerto coincide tanto en la fuente como en los
destinos; pero no la dirección de multicast.
Resultado: Aunque ambos procesos leen del mismo “buzón”
(puerto); pero no pertenecen al grupo al que se envía el mensaje; por lo que no lo
leen y tampoco lo muestran.
Emisor:
Proceso receptor 1:
Proceso receptor 2:
Podemos comparar entonces a la dirección de multicast como
una ciudad donde si el alcalde “emisor” envía un comunicado, dicho mensaje les
compete a todos; pero para que lo lean, debe depositarlo en el buzón adecuado.
Concluimos por tanto que en la comunicación multicast no
fiable tanto la dirección de multidifusión como el puerto son importantes para
la comunicación.
No hay comentarios:
Publicar un comentario