Вы находитесь на странице: 1из 6

Aplicaciones para Comunicaciones en Red

Unidad 2: Sockets de Datagrama

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

Araujo Daz David

Aplicaciones para Comunicaciones en Red

Unidad 2: Sockets de Datagrama

Un proceso que se ha unido a un grupo de multidifusin puede recibir mensajes. El siguiente


segmento de cdigo ilustra la sintaxis usada para recibir mensajes enviados a un grupo de
multidifusin.
byte[] almacen = new byte[1000];
InetAddress grupo = InetAddress.getByName("239.1.2.3");
MulticastSocket s = new MulticastSocket(3456);
s.joinGroup(grupo);
DatagramPacket recibido = new DatagramPacket(almacen, almacen.length);
s.receive(recibido);
Un proceso puede dejar un grupo de multidifusin invocando el mtodo leaveGroup de un objeto
MulticastSocket, especificando la direccin de multidifusin del grupo:
s.leaveGroup(grupo);
El soporte en tiempo de ejecucin de una API de multidifusin a menudo emplea una tcnica
conocida como propagacin de mensajes, en la que se propaga un paquete desde una mquina a
una mquina vecina usando un algoritmo que, cuando se ejecuta apropiadamente, entregar
finalmente el mensaje a todos los participantes. Sin embargo, ante alguna circunstancia anmala,
es posible que el algoritmo que controla la propagacin de mensajes no termine apropiadamente,
dando como resultado que un paquete circule por la red indefinidamente. Este fenmeno no es
deseable, ya que causa una sobrecarga innecesaria en los sistemas y en la red. Para evitar que
esto ocurra, se recomienda que se fije un parmetro tiempo-de-vida en cada datagrama de
multidifusin. El parmetro de tiempo de vida (ttl, time-to-live), cuando se fija, limita el nmero de
enlaces de red, o saltos, a travs de los que se retransmitir el paquete en la red.
En el API de Java, este parmetro se puede fijar invocando el mtodo setTimeToLive del
MulticastSocket del emisor de la siguiente manera:
String msj = "Hola
InetAddress grupo =
MulticastSocket s =
s.setTimeToLive(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

Araujo Daz David

Aplicaciones para Comunicaciones en Red

Unidad 2: Sockets de Datagrama

Ejemplo 1: Ejemplo simple de aplicacin de multidifusin. Cuando se ejecuta, cada proceso


receptor se subscribe al grupo de multidifusin 239.1.2.3 en el puerto 1234 y espera la llegada
de un mensaje. El proceso emisor, por otro lado, no es un miembro del grupo de multidifusin
(aunque podra serlo); dicho proceso manda un nico mensaje al grupo de multidifusin
239.1.2.3 en el puerto 1234 antes de cerrar su socket de multidifusin.
Programa 1.1: Ejemplo1Emisor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

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

Araujo Daz David

Aplicaciones para Comunicaciones en Red

Unidad 2: Sockets de Datagrama

Programa 1.2: Ejemplo1Receptor.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

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

Araujo Daz David

Aplicaciones para Comunicaciones en Red

Unidad 2: Sockets de Datagrama

Ejemplo 2: Cada proceso de un grupo de multidifusin manda un mensaje, y, de forma


independiente, cada proceso tambin visualiza todos los mensajes que recibe como miembro del
grupo de multidifusin. Ejemplo2EmisorReceptor.java es el cdigo del ejemplo. En el mtodo
main se crea un hilo para recibir y visualizar los mensajes. Para asegurarse de que cada proceso
est listo para recibir, se realiza una pausa antes de que el proceso enve su mensaje.
Programa 2.1: Ejemplo2EmisorReceptor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

// Este programa ilustra el envo y recepcin usando multidifusin


import java.io.*;
import java.net.*;
/**
* Este ejemplo ilustra el uso de mltiples hilos para enviar y
* recibir multidifusin en un proceso.
*
*/
public class Ejemplo2EmisorReceptor{
//
//
//
//
//
//

Una aplicacin que usa un socket de multidifusin para enviar


un nico mensaje a un grupo de multidifusin, y utiliza un hilo
independiente que usa otro socket de multidifusin para recibir
mensajes enviados al mismo grupo.
Se requieren tres argumentos de lnea de mandato:
<direccin IP de multidifusin>,<puerto de multidifusin>,<mensaje>
public static void main(String[ ] args) {
InetAddress grupo = null;
int puerto = 0;
MulticastSocket socket = null;
String caracteres;
byte[] datos = null;
if (args.length !=3)
System.out.println("Se requieren 3 argumentos de lnea de mandato");
else {
try {
grupo = InetAddress.getByName(args[0]);
puerto = Integer.parseInt(args[1]);
caracteres = args[2];
datos = caracteres.getBytes();
DatagramPacket paquete =
new DatagramPacket(datos, datos.length, grupo, puerto);
Thread elHilo =
new Thread(new HiloLector(grupo, puerto));
elHilo.start();
System.out.println("Pulse Intro cuando est listo para enviar:");
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
br.readLine();
socket = new MulticastSocket(puerto);
socket.setTimeToLive(1);
socket.send(paquete);
socket.close( );
}
catch (Exception se) {
se.printStackTrace( );
} // fin de catch
} // fin de else
} // fin de main

} // fin de class

Araujo Daz David

Aplicaciones para Comunicaciones en Red

Unidad 2: Sockets de Datagrama

Programa 2.2: HiloLector.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

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).

Araujo Daz David

Вам также может понравиться