Socket multicast en java

De ChuWiki

¿Qué es un socket multicast?[editar]

A veces nos interesa que un ordenador pueda enviar un mensaje por red y que este sea recibido por otros ordenadores simultáneamente. Para ello están las direcciones multicast. Son direcciones en el rango 224.0.0.0 a 239.255.255.255. La 224.0.0.0 está reservada y no puede usarse. Enviando mensajes por estas direcciones, cualquier otro ordenador en la red que las escuche podría leer dicho mensaje, independientemente de cual sea la IP real de ese ordenador. Es decir, si un ordenador quiere enviar un mensaje simultáneamente a varios, puede hacerlo enviando el mensaje a una de estas IPs, los demás ordenadores deben estar a la escucha de dichas IPs para recibir el mensaje.

Enviar un mensaje Multicast en java[editar]

El siguiente código permite a una aplicación Java enviar un mensaje Multicast, de forma que los demás ordenadores de la red puedan recogerlo.

MulticastSocket enviador = new MulticastSocket();

// El dato que queramos enviar en el mensaje, como array de bytes.
byte [] dato = new byte[] {1,2,3,4};

// Usamos la direccion Multicast 230.0.0.1, por poner alguna dentro del rango
// y el puerto 55557, uno cualquiera que esté libre.
DatagramPacket dgp = new DatagramPacket(dato, dato.length, InetAddress.getByName("230.0.0.1"), 55557);

// Envío
enviador.send(dgp);


Lectura de un mensaje Multicast[editar]

En el ordenador que queramos leer este mensaje, el código java sería el siguiente

// El mismo puerto que se uso en la parte de enviar.
MulticastSocket escucha = new MulticastSocket(55557);

// Nos ponemos a la escucha de la misma IP de Multicast que se uso en la parte de enviar.
escucha.joinGroup(InetAddress.getByName("230.0.0.1"));
					
// Un array de bytes con tamaño suficiente para recoger el mensaje enviado, 
// bastaría con 4 bytes.
byte [] dato = new byte [1024];

// Se espera la recepción. La llamada a receive() se queda
// bloqueada hasta que llegue un mesnaje.
DatagramPacket dgp = new DatagramPacket(dato, dato.length);
escucha.receive(dgp);

// Obtención del dato ya relleno.
byte [] dato2 = dgp.getData();

Enlaces[editar]