Академический Документы
Профессиональный Документы
Культура Документы
Sockets de multidifusin
En el nivel de transporte, la multidifusin bsica es una extensin del Protocolo Datagrama de
Usuario (UDP, User Datagram Protocol), que es sin conexin y no fiable. En el nivel de red de la
arquitectura de red, los paquetes de multidifusin se transmiten a travs de la red utilizando el
encaminamiento de multidifusin de Internet proporcionado por encaminadores (conocidos
como mrouters) capaces de encaminar la multidifusin adems de la unidifusin. La multidifusin
en una red local (una interconectada sin un encaminador) se lleva a cabo utilizando la multidifusin
proporcionada por el protocolo de red de rea local (como la multidifusin de Ethernet).
El API de multidifusin bsica de Java proporciona un conjunto de clases que estn estrechamente
relacionadas con las clases del API de sockets de datagrama. Hay tres clases principales en el
API:
InetAddress. En el API de sockets datagrama, esta clase representa la direccin IP del
emisor o del receptor. En la multidifusin, esta clase puede utilizarse para identificar un
grupo de multidifusin.
DatagramPacket. Como en el caso de los sockets datagrama, un objeto de esta clase
representa un datagrama real; en multidifusin, un objeto de DatagramPacket representa
un paquete de datos enviado a todos los participantes o recibidos por cada participante de
un grupo de multidifusin.
MulticastSocket. La clase MulticastSocket se deriva de la clase DatagramSocket, con
capacidades adicionales para incorporarse o abandonar un grupo de multidifusin. Un
objeto de las clase socket datagrama de multidifusin puede utilizarse para mandar y
recibir paquetes IP de multidifusin.
Para incorporarse a un grupo de multidifusin en una direccin IP m y un puerto UDP p, se
debe instanciar un objeto MulticastSocket con p y, a continuacin, se puede invocar el mtodo
joinGroup, especificando la direccin m:
// Incorporacin a un grupo de multidifusin en la direccin
// En el puerto 3456
InetAddress grupo = InetAddress.getByName("224.0.0.1 ");
MulticastSocket s = new MulticastSocket(3456);
s.joinGroup(grupo);
Se puede mandar un mensaje de multidifusin se debe crear un paquete de datagrama con la
especificacin de una referencia a un vector de octetos que contenga los datos, la longitud del
vector, la direccin de multidifusin y el nmero de puerto. A continuacin, se puede invocar el
mtodo send del objeto MulticastSocket (heredado de la clase DatagramSocket) para mandar los
datos.
No es necesario que un proceso se una a un grupo de multidifusin para mandar mensajes al
mismo, aunque debe hacerlo para poder recibir los mensajes. Cuando se manda un mensaje a un
grupo de multidifusin, todos los procesos que se han unido al grupo de multidifusin, que puede
incluir al emisor, deberan recibir el mensaje, aunque no se garantiza.
El siguiente segmento de cdigo ilustra la sintaxis requerida para enviar un mensaje a un grupo de
multidifusin:
String msj = "Este es un mensaje de multidifusin.";
InetAddress grupo = InetAddress.getByName("239.1.2.3");
MulticastSocket s = new MulticastSocket(3456);
s.joinGroup(grupo); // opcional
DatagramPacket hola = new DatagramPacket(msj.getBytes( ),
msj.length( ), grupo, 3456);
s.send(hola);
1
a todos!";
InetAddress.getByName("224.0.0.1");
new MulticastSocket(3456);
// ajusta time-to-live a 1 salto un valor apropiado
// para multidifusin en mquinas locales
DatagramPacket hola = new DatagramPacket(msj.getBytes( ),
msj.length( ),grupo, 3456);
s.send(hola);
El valor especificado para el ttl debe estar en el rango 0 ttl 255; en caso contrario, se
activar una IllegalArgumentException.
Los valores de ttl recomendados son:
0 si la multidifusin est restringida a procesos en la misma mquina
1 si la multidifusin est restringida a procesos en la misma subred
32 si la multidifusin est restringida a procesos en la misma zona
64 si la multidifusin est restringida a procesos en la misma regin
128 si la multidifusin est restringida a procesos en el mismo continente
255 si la multidifusin no est restringida
import java.io.*;
import java.net.*;
/**
* Este ejemplo ilustra la sintaxis de la multidifusin bsica.
* EMISOR
*/
public class Ejemplo1Emisor {
// Una aplicacin que usa un socket de multidifusin para enviar
// un nico mensaje a un grupo de multidifusin.
// El mensaje se especifica como un argumento de lnea de mandato.
public static void main(String[ ] args) {
MulticastSocket s;
InetAddress grupo;
if (args.length != 1)
System.out.println
("Este programa requiere un argumento de lnea de mandato");
else {
try {
// crea el socket de multidifusin
grupo = InetAddress.getByName("239.1.2.3");
s = new MulticastSocket(3456);
s.setTimeToLive(32); // restringe multidifusin a procesos que
// ejecutan en mquinas en la misma zona.
String msj = args[0];
DatagramPacket paquete =
new DatagramPacket(msj.getBytes(), msj.length(),
grupo, 3456);
s.send(paquete);
s.close( );
}
catch (Exception ex) { // llega aqu si ocurre un error
ex.printStackTrace( );
} // fin de catch
} //fin de else
} // fin de main
} // fin de class
import java.io.*;
import java.net.*;
/**
* Este ejemplo ilustra la sintaxis de la multidifusin bsica.
* RECEPTOR
*/
public class Ejemplo1Receptor {
// Una aplicacin que se une a un grupo de multidifusin y
// recibe el nico mensaje enviado al grupo.
public static void main(String[ ] args) {
MulticastSocket s;
InetAddress grupo;
try {
// se une a un grupo de multidifusin y espera recibir un mensaje
grupo = InetAddress.getByName("239.1.2.3");
s = new MulticastSocket(3456);
s.joinGroup(grupo);
byte[] almacen = new byte[100];
DatagramPacket recibido = new DatagramPacket(almacen, almacen.length);
s.receive(recibido);
System.out.println(new String(almacen));
s.close( );
}
catch (Exception ex) { // llega aqu si ocurre un error
ex.printStackTrace( );
} // fin de catch
} // fin de main
} // fin de class
} // fin de class
import java.net.*;
import java.io.*;
/**
* Esta clase es utilizada por Ejemplo2EmisorReceptor para
* leer mensajes de multidifusin mientras el hilo principal enva
* un mensaje de multidifusin. Hace eco en la pantalla de cada
* mensaje ledo.
*
*/
class HiloLector implements Runnable {
static final int MAX_LON = 30;
private InetAddress grupo;
private int puerto;
public HiloLector(InetAddress grupo, int puerto) {
this.grupo = grupo ;
this.puerto = puerto;
}
public void run( ) {
try {
MulticastSocket socket = new MulticastSocket(puerto);
socket.joinGroup(grupo);
while (true) {
byte[ ] datos = new byte[MAX_LON];
DatagramPacket paquete =
new DatagramPacket(datos, datos.length, grupo, puerto);
socket.receive(paquete);
String s = new String(paquete.getData());
System.out.println(s);
} // fin de while
} // fin de try
catch (Exception exception) {
exception.printStackTrace( );
} // fin de catch
} // fin de run
} //fin de class
El API de multidifusin de Java y mecanismos similares pueden emplearse para dar soporte a la
lgica de servicio de una aplicacin. Ntese que una aplicacin puede utilizar una combinacin de
unidifusin y multidifusin.
Una aplicacin que hace uso de la multidifusin a veces se denomina aplicacin consciente de la
multidifusin (multicast-aware).