Académique Documents
Professionnel Documents
Culture Documents
Principes généraux
Le mode de communication utilisé par le protocole UDP est le mode non connecté. Dans ce mode
de fonctionnement, il n’est pas nécessaire de préparer la communication. Chaque datagramme est
transféré indépendamment des autres. Ceci implique que chaque datagramme devra rechercher une
route vers le destinataire. De ce fait, il n’y a pas de garantie, ni sur l’arrivée des paquets à destination,
ni sur l’ordre d’arrivée de ces derniers. La seule garantie offerte par ce mode de communication est
le fait que les données reçues sont sans erreur.
Pour utiliser le protocole de transport UDP, il est nécessaire en Java de manipuler deux
classes DatagramPacket et DatagramSocket
La classe DatagramPacket
Cette classe permet de créer des objets qui contiendront les données envoyées ou reçues ainsi que
l'adresse de destination ou de provenance du datagramme.
Deux constructeurs sont disponibles, un pour les paquets à recevoir, l'autre pour les paquets à
envoyer.
public DatagramPacket(byte buffer[], int taille, InetAddress adresse, int port) : Construit un
objet pour envoyer un datagramme. Le paramètre buffer correspond à la zone où est stocké le
datagramme à envoyer, le paramètre taille correspond à la taille du datagramme à
envoyer, adresse correspond à l'adresse de la machine à qui envoyer le datagramme et port sur
quel port UDP.
public synchronized byte[] getData () : Retourne les données stockées dans le paquet.
public synchronized int getLength () : Retourne la taille des données stockées dans le paquet.
La classe DatagramSocket
Cette classe permet de créer des sockets UDP qui permettent d'envoyer et de recevoir des
datagrammes UDP.
Avant toute communication en mode UDP il est nécessaire de créer une socket aussi bien du coté
client que du coté serveur. Pour cela Java propose trois constructeurs :
public DatagramSocket (int port) throws SocketException : Crée un objet de type socket et
l'attache au port UDP local passé en paramètre. En particulier, ce constructeur doit être utilisé
dans les serveurs pour lesquels le port d'attachement a besoin d'être fixé préalablement afin qu'il
soit connu des clients.
Une fois la socket (objet de type DatagramSocket) créée et attachée à un port particulier de la
machine locale, il est possible d'envoyer et de recevoir des datagrammes, via cette socket, au moyen
des méthodes suivantes :
public void send(DatagramPacket data) throws IOException: Permet d'envoyer les données
contenues dans la variable data vers la machine et le port dont les valeurs ont été préalablement
spécifiées dans la variable data.
Il est possible de spécifier un délai d'attente maximal en reception. Pour cela, il faut positionner
une variable de timeout sur la socket au moyen de la méthode :
public void close () : Ferme la socket et libère les ressources qui lui sont associées. La socket ne
pourra plus être utilisée ni pour envoyer, ni pour recevoir des datagrammes.
public int getLocalPort () : Retourne le port d'attachement de la socket.
Exercice 1 :
Tester sur même machine et deux machines distants le code des parties client et serveur.
Module Systèmes Répartis
Coté client :
import java.net.*;
import java.util.Scanner;
try {
// on récupère les paramètres : nom de la machine serveur et
// numéro de port
System.out.println("Adress du serveur : ");
host = keyb.next();
System.out.println("port d'écoute du serveur : ");
port = keyb.nextInt();
InetAddress adr;
DatagramPacket packet;
DatagramSocket socket;
Coté serveur :
import java.net.*;
import java.util.Scanner;
int port = 0;
Scanner keyb = new Scanner(System.in);
try {
DatagramPacket packet;
On souhaite échanger entre le client/serveur les objets d’une classe voiture via les sockets
UDP.
Pour cela le client Crée un objet voiture et l’envoi au serveur pour lui fixer une quantité de
carburant avec la méthode setCarburant().
import java.io.*;
Exercice 3 :
Créez localement un serveur UDP qui écoutera sur le port 1250 et qui pour chaque datagramme
reçu et quelque soit leur contenu, retournera à l’émetteur un datagramme contenant la date et
l’heure courante.