image/svg+xml $ $ ing$ ing$ ces$ ces$ Res Res ea ea Res->ea ou ou Res->ou r r ea->r ch ch ea->ch r->ces$ r->ch ch->$ ch->ing$ T T T->ea ou->r

Le protocole UDP

Présentation de UDP (User Datagram Protocol)

Format du datagramme UDP

Les sockets UDP en Java

Sockets

Sur les systèmes POSIX

Les interfaces réseau

Pour en savoir plus sur la manipulation des interfaces réseau en Java

DatagramSocket

Socket réseau UDP : classe DatagramSocket

Association d'une adresse et d'un port pour recevoir ou envoyer des datagrammes UDP

Constructeurs disponibles :

Ces constructeurs peuvent lever une SocketException si la socket ne peut être allouée.
Après utilisation, une socket doit être fermée avec close() pour libérer les ressources systèmes associées.

Datagramme UDP : classe DatagramPacket

Cette classe permet de manipuler des datagrammes UDP.

DatagramPacket a un double usage :

  1. Paquet à envoyer : l'adresse (p.getAddress()) et le port (p.getPort()) sont les coordonnées du destinataire
  2. Paquet reçu : l'adresse et le port sont les coordonnées de l'expéditeur

Caractères et octets

Des caractères vers les octets (et vice-versa)

Envoyer et recevoir des paquets avec DatagramSocket

Envoyons un paquet avec des données aléatoires
public static void sendRandomPacket(DatagramSocket socket, String addressee, int port, int dataLength) throws IOException
{
	DatagramPacket dp = new DatagramPacket(new byte[dataLength], dataLength);
	// setting the coordinates
	dp.setAddress(addressee);
	dp.setPort(port);
	// put random data into the packet
	Random r = new Random();
	r.nextBytes(dp.getData());
	// sending the packet
	socket.send(dp);
}

Recevons un paquet avec un timeout
public static boolean receiveAndDisplayPacket(DatagramSocket socket, int timeout) throws IOException
{
	socket.setSoTimeout(timeout);
	DatagramPacket dp = new DatagramPacket(new byte[2048], 2048); // can receive packets containing at most 2048 bytes (trailing bytes are truncated)
	try {
		socket.receive(dp); // we receive the packet (unless timeout)
		System.out.println("Have received packet from address=" + dp.getAddress() + " at port " + dp.getPort());
		System.out.println("This packet contains the following bytes: ");
		for (int i = dp.getOffset(); i < dp.getOffset() + dp.getLength(); i++) {
			System.out.print(((int)dp.getData()[i]) & 0xff); // display the byte using an unsigned form
			System.out.print(" ");
		}
		System.out.println(); // for line return
		return true;
	} catch (SocketTimeoutException e)
	{
		return false; // timeout occurred
	}
}


Envoyer des paquets UDP contenant du texte

Processus pour envoyer et recevoir un paquet UDP contenant du texte

Exemple Java : envoyer un paquet contenant l'heure à une plage d'adresses

Content not available

Quelques conseils pour l'échange de paquets

Mécanisme de pseudo-connexion

Quelques tests avec Netcat

Netcat : application simple pour communiquer en UDP (et aussi en TCP)

Limitation pour le serveur netcat : communication avec un seul client

Exemple Java : recevoir des datagrammes sur un port avec un délai limite

Content not available

Multicast

Multicast UDP

Principe :

Avantages :

Usages pratiques :

Protocoles de multicast

java.net.MulticastSocket