Aller au contenu

Gestion multidiffusion (multicast)

Les datagrammes en multidiffusion sont pratiques pour envoyer le même message à plusieurs personnes simultannément. Cette méthode sert notamment au déploiement massif de systèmes d'exploitations dans un parc informatique ou à des outils spécialisés tels que Faronic Insight.

Dans le code, il existe beaucoup de ressemblance entre la multidiffusion et la réception d'un datagramme :

  1. On doit créer un groupe de multidiffusion
  2. On doit utiliser un MulticastSocket au lieu d'un DatagramSocket
  3. On doit joindre le groupe de multidiffusion

Tout le reste est identique.

Adresses IP de multidiffusion

Les adresses IP pour la multidiffusion utilisent des plages spéciales :

Début Fin Utilité
224.0.0.0 224.0.0.255 Reservé pour des protocoles spéciaux
224.0.1.0 238.255.255.255 Réservé et routables sur Internet
239.0.0.0 239.255.255.255 Utilisables localement

Pour des programmes locaux, le bloc d'adresses 239.0.0.0/8 sera idéal.

Rejoindre un groupe de multidiffusion

Un groupe de multidiffusion existe à la grandeur du réseau. Rejoindre un groupe correspond à entrer dans un local : tout le monde peut parler, tout le monde peut écouter.

// L'adresse du groupe à rejoindre
InetAddress inetAddress = InetAddress.getByName("239.0.0.1");
InetSocketAddress mcastGroup = new InetSocketAddress(inetAddress, port);

// Création du socket de multidiffusion
try (MulticastSocket multicastSocket = new MulticastSocket(port)) {
    // Rejoindre le groupe de multidiffusion
    multicastSocket.joinGroup(mcastGroup, null);

    // Envoyer ou recevoir des données
    ...
}

Envoyer un paquet de multidiffusion

Envoyer un paquet de multidiffusion est identique à envoyer un paquet UDP. La seule différence est l'utilisation d'un MulticastSocket plutôt que d'un DatagramSocket :

// Préparer le message
String message = "Hello Multicast!";
DatagramPacket datagramPacket = new DatagramPacket(message.getBytes(), message.length(), inetAddress, port);

// Envoyer le datagramme via le socket de multidiffusion
multicastSocket.send(datagramPacket);

Recevoir un paquet de multidiffusion

La réception est également identique à UDP :

// Créer une mémoire tampon où mettre le message reçu
byte[] buffer = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length);

// Recevoir un maximum de 1024 octets
multicastSocket.receive(datagramPacket);

// Afficher le message
String received = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
System.out.println("Received from server: " + received);