Programmation Réeau Java
Programmation Réeau Java
Programmation
Réseau - Java
Enseignant :
Dr. BADR EL KHALYLY
Année Universitaire
2024 - 2025
Table des matières
1. Introduction à la Programmation Réseau .............................................................................. 4
1.1. Concepts de base du réseau .............................................................................................. 4
1.2. Différences entre TCP et UDP .......................................................................................... 4
1.3. Notion de sockets ............................................................................................................. 4
Exemple avec un socket : .................................................................................................... 5
1.4. Sockets vs Datagramme : ................................................................................................. 5
Sockets orientés connexion (TCP) : .................................................................................... 5
Sockets sans connexion (UDP) : ......................................................................................... 6
1.5. Étapes de création et de gestion d'un socket (en Java) .................................................... 7
Exemple simple de communication client-serveur avec des sockets TCP : ........................ 7
Exemple simple de communication client-serveur avec des sockets UDP : ....................... 8
1.6. Communication entre deux Applications à travers la Stack TCP/IP .............................. 11
2. Multithreading en Java ........................................................................................................ 12
2.1. Introduction aux Threads .............................................................................................. 12
2.2. Concepts Clés du Multithreading .................................................................................. 12
2.3. Créer et Démarrer un Thread en Java ........................................................................... 12
2.3.1. Utiliser la classe Thread........................................................................................... 12
2.3.2. Utiliser l’interface Runnable ................................................................................... 13
2.3.3. Utiliser ExecutorService.......................................................................................... 13
2.4. Synchronisation et Ressources Partagées ..................................................................... 14
2.4.1. Utiliser synchronized ............................................................................................... 14
2.4.2. Bloc synchronized ................................................................................................... 14
2.5. Problèmes Communes avec le Multithreading .............................................................. 15
3. Communication Bloquante vs Non Bloquante ..................................................................... 16
3.1. Communication Bloquante ............................................................................................ 16
3.1.1. Exemple en Java ...................................................................................................... 16
3.1.2. Limitations de la Communication Bloquante ..........................................................17
3.2. Communication Non Bloquante .....................................................................................17
3.2.1. Exemple en Java avec NIO .......................................................................................17
3.2.2. Avantages de la Communication Non Bloquante ................................................... 18
3.2.3. Inconvénients .......................................................................................................... 19
3.3. Comparaison Bloquant vs Non Bloquant ...................................................................... 19
3.4. Bloquante vs Non-bloquante : ....................................................................................... 19
4. Topologies Réseau ................................................................................................................ 19
4.1. Topologie en Étoile (Star Topology) .............................................................................. 19
4.1.1. Exemple en Java (Serveur en Étoile) ....................................................................... 19
4.1.2. Avantages et Inconvénients ..................................................................................... 21
4.2. Topologie en Anneau (Ring Topology) .......................................................................... 21
4.2.1. Exemple en Java (Topologie en Anneau) ................................................................ 21
TITRE DU RAPPORT 2
4.2.2. Avantages et Inconvénients .................................................................................... 22
4.3. Topologie en Bus (Bus Topology) .................................................................................. 22
4.3.1. Exemple en Java ...................................................................................................... 22
4.3.2. Avantages et Inconvénients .................................................................................... 23
4.4. Topologie Maillée (Mesh Topology) .............................................................................. 23
4.4.1. Exemple en Java ...................................................................................................... 23
5. Introduction aux Brokers et Systèmes de Messagerie .......................................................... 25
5.1. Rôle du Broker de Messages........................................................................................... 25
5.2. Mécanismes de Communication .................................................................................... 25
5.3. Exemples d'Utilisation des Brokers ............................................................................... 25
5.4. Propriétés des Systèmes de Messagerie......................................................................... 26
5.5. Exemple d'Implémentation d'un Broker Simple en Java .............................................. 26
5.6. Conclusion ..................................................................................................................... 28
5.7. Notions de Topic, Queue et Exchange ........................................................................... 28
5.7.1. Queue ....................................................................................................................... 28
5.7.2. Topic ........................................................................................................................ 28
5.7.3. Exchange ................................................................................................................. 29
5.7.4. Comparaison entre Queue, Topic, et Exchange ...................................................... 30
6. Réimplantation des Protocoles de Couches d'Application en Sockets et Threads ............... 30
6.1. Principes Fondamentaux des Protocoles de Couches d'Application ............................. 30
6.2. Réimplantation du Protocole REST avec Sockets et Threads ....................................... 31
6.3. Réimplantation du Protocole MQTT avec Sockets et Threads ...................................... 31
6.4. Réimplantation du Protocole AMQP ............................................................................. 32
6.5. Réimplantation du Protocole CoAP ............................................................................... 32
6.6. Réimplantation du Protocole XMPP ............................................................................. 32
6.7. Réimplantation du Protocole STOMP ........................................................................... 33
7. Clone et Ré-implémentation d'Applications de Chat ........................................................... 34
a) WhatsApp : Messagerie instantanée avec chiffrement E2EE (End-to-End Encryption) 34
b) Telegram : Messagerie basée sur le cloud ........................................................................ 35
c) Signal : Chiffrement avancé et gestion des métadonnées ................................................ 35
d) Appels VoIP : Utilisation d'UDP pour les appels audio/vidéo en temps réel .................. 36
TITRE DU RAPPORT 3
1. Introduction à la
Programmation Réseau
1.1. Concepts de base du réseau
La programmation réseau repose sur l'échange de données entre différentes machines connectées
via un réseau. Il existe deux architectures fondamentales utilisées pour ces échanges :
Client-Serveur : Une machine (le client) envoie des requêtes à une autre machine (le
serveur), qui les traite et renvoie des réponses.
Peer-to-Peer (P2P) : Chaque machine peut jouer à la fois le rôle de client et de serveur, et
les échanges se font directement entre elles sans serveur centralisé.
TITRE DU RAPPORT 4
2. La transmission des données : Une fois qu'un point de communication est établi entre
deux entités (par exemple, un client et un serveur), les données peuvent circuler dans les deux
sens via ce point.
Port : Un numéro spécifique qui identifie une application ou un service sur cette machine.
En utilisant un socket, une application peut envoyer ou recevoir des données sur le réseau. Ces
données peuvent être des fichiers, des messages, des requêtes ou des réponses d'API, etc.
1.4. Sockets vs Datagramme :
Il existe principalement deux types de sockets :
Sockets orientés connexion (TCP) :
Utilisés pour établir une connexion fiable entre deux machines. Le protocole TCP assure que les
données arrivent dans le bon ordre et sans perte.
o Exemple : Une requête HTTP pour charger une page web utilise un socket TCP entre le
navigateur et le serveur.
Caractéristiques du socket TCP :
Connexion orientée : TCP établit une connexion formelle entre le client et le serveur avant
d'envoyer des données. Ce processus est appelé le handshake en trois étapes :
Le client envoie une requête de connexion (SYN) au serveur.
Le serveur répond avec une acceptation (SYN-ACK).
Le client envoie une confirmation (ACK) pour finaliser la connexion.
Fiabilité : TCP garantit que toutes les données envoyées par le client arrivent bien au
serveur, dans le bon ordre et sans duplication. Si un paquet est perdu, TCP le retransmet.
TITRE DU RAPPORT 5
Contrôle de flux et de congestion : TCP régule le débit de transmission de données en
fonction des capacités du réseau pour éviter de le surcharger.
Segmentation et réassemblage : Si les données envoyées sont trop volumineuses pour
être envoyées en un seul paquet, TCP les segmente en paquets plus petits. Il s'assure ensuite
que tous les paquets sont réassemblés dans le bon ordre à destination.
Communication fiable : Une fois la connexion établie, les deux côtés (client et serveur)
peuvent envoyer et recevoir des données de manière bidirectionnelle et synchronisée. Si une
donnée n'arrive pas à destination, TCP le détecte et la retransmet.
Exemple d'utilisation de TCP :
HTTP/HTTPS : Pour le chargement des pages web.
FTP (File Transfer Protocol) : Pour le transfert de fichiers.
Email (SMTP/IMAP) : Pour envoyer ou recevoir des emails.
Sans connexion : Contrairement à TCP, UDP n’établit pas de connexion formelle entre le
client et le serveur. Il envoie simplement des datagrammes (paquets de données) sans
vérifier si le destinataire est prêt à les recevoir ou même si les paquets arrivent à destination.
Pas de fiabilité garantie : UDP n’assure pas que les données arriveront à destination ni
qu’elles arriveront dans le bon ordre. Si des paquets sont perdus, ils ne seront pas retransmis.
Pas de segmentation ou réassemblage : Si un datagramme est trop volumineux pour
être envoyé, il peut être perdu. Contrairement à TCP, UDP ne segmente pas les données
automatiquement.
Faible latence : UDP est plus rapide que TCP car il n’y a pas de phase de connexion et de
contrôle de flux. Cela en fait un bon choix pour les applications qui privilégient la rapidité
plutôt que la fiabilité.
Léger : UDP a moins de surcharge que TCP, ce qui en fait un protocole idéal pour des
communications rapides et courtes.
Exemple d'utilisation de UDP :
Streaming vidéo ou audio : Comme les vidéos ou les appels en ligne (VoIP), où une légère
perte de paquets n'a pas un impact critique sur la qualité globale.
Jeux en ligne : Les jeux vidéo multijoueurs utilisent souvent UDP pour les mises à jour de
position des joueurs, car la rapidité prime sur la fiabilité.
Exemple : Le streaming vidéo ou les jeux en ligne peuvent utiliser des sockets UDP pour réduire la
latence.
3. Rôle des sockets dans une communication réseau
Les sockets sont responsables de l'envoi et de la réception des paquets de données entre deux
machines. Voici comment cela fonctionne généralement :
1. Le serveur crée un socket pour écouter les connexions entrantes sur un port spécifique. Il
attend qu'un client s'y connecte.
TITRE DU RAPPORT 6
2. Le client crée un socket et essaie de se connecter au serveur en utilisant son adresse IP et
le port d'écoute.
3. Une fois la connexion établie (pour les sockets TCP), le client et le serveur peuvent
échanger des données.
4. Les sockets UDP, quant à eux, envoient les données sans étape de connexion formelle, mais
le client et le serveur doivent toujours spécifier les adresses et ports respectifs.
4. Structure d’un socket
Chaque socket possède une paire d’identifiants :
L’adresse IP de la machine qui exécute le programme (client ou serveur).
import [Link].*;
import [Link].*;
TITRE DU RAPPORT 7
[Link]("Message reçu du client : " + message);
// Répondre au client
PrintWriter out = new PrintWriter([Link](), true);
[Link]("Message bien reçu : " + message);
import [Link].*;
import [Link].*;
Explication :
Le serveur crée un objet ServerSocket qui écoute sur le port 8080. Il attend les connexions
entrantes à l'aide de la méthode accept().
Le client se connecte au serveur en créant un Socket pointant sur localhost (c’est-à-dire la
machine locale) et le port 8080.
Le client envoie un message au serveur via un flux de sortie (OutputStream), et le serveur le
lit à partir d’un flux d’entrée (InputStream).
Le serveur renvoie une réponse au client, qui l'affiche.
TITRE DU RAPPORT 8
Serveur UDP en Java
while (true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, [Link]);
[Link](receivePacket); // Le serveur attend un paquet
// Adresse IP du serveur
InetAddress serverAddress = [Link]("localhost");
TITRE DU RAPPORT 9
// Création du datagramme à envoyer au serveur
DatagramPacket sendPacket = new DatagramPacket(sendData, [Link],
serverAddress, 9876);
[Link](sendPacket); // Envoi du datagramme au serveur
TITRE DU RAPPORT 11
2. Multithreading en
Java
2.1. Introduction aux Threads
Un thread est l'unité de base d'exécution dans un programme. Dans une application multithread,
plusieurs tâches peuvent s'exécuter en parallèle, ce qui permet d'améliorer l'efficacité et la réactivité
de l'application. En Java, la gestion des threads est une fonctionnalité native fournie par la classe
Thread et l'interface Runnable.
Le multithreading est particulièrement utile en programmation réseau, car il permet à un serveur
de gérer plusieurs connexions simultanées sans bloquer l'exécution. Par exemple, un serveur
multithread peut accepter une connexion de client, tout en continuant à écouter d'autres connexions
et à traiter des requêtes en parallèle.
2.2. Concepts Clés du Multithreading
Avant de plonger dans la programmation des threads en Java, il est important de comprendre
quelques concepts fondamentaux :
Thread Principal : Chaque application Java a un thread principal (le thread qui exécute la
méthode main). Tous les threads supplémentaires créés par le programme sont des sous-
threads du thread principal.
Cycle de Vie d’un Thread : Un thread passe par plusieurs états pendant son cycle de vie :
o New : Le thread est créé mais pas encore démarré.
o Runnable : Le thread est prêt à être exécuté par le planificateur.
o Running : Le thread est actuellement en cours d'exécution.
o Blocked/Waiting : Le thread est temporairement en attente d'une ressource ou d'un
signal.
o Terminated : Le thread a terminé son exécution.
Concurrence : Le multithreading permet l'exécution simultanée de plusieurs threads, mais
il est important de synchroniser l'accès aux ressources partagées pour éviter les problèmes de
concurrence, tels que les conditions de course et les blocages.
TITRE DU RAPPORT 12
}
Ici, la méthode run() contient le code que vous souhaitez exécuter dans un thread séparé.
Pour démarrer le thread, on appelle la méthode start(), qui démarre l'exécution en parallèle
avec le thread principal.
[Link]();
[Link]();
}
}
Dans cet exemple, la méthode incrementer() est synchronisée. Cela garantit qu'un seul thread à la
fois peut modifier la variable compteur, évitant ainsi les conditions de course.
2.4.2. Bloc synchronized
En plus de synchroniser des méthodes entières, il est possible de synchroniser uniquement des blocs
de code spécifiques à l'intérieur d'une méthode.
Exemple :
class Banque {
private int solde = 1000;
TITRE DU RAPPORT 15
3. Communication
Bloquante vs Non
Bloquante
La gestion des entrées/sorties (I/O) est un aspect crucial en programmation réseau, car les
opérations de communication peuvent impliquer des échanges de données à travers le réseau. Ces
opérations peuvent être longues et affecter la performance d'une application si elles ne sont pas bien
gérées. Il existe deux principaux modèles de gestion des I/O en réseau : la communication
bloquante et la communication non bloquante. Ces deux concepts influencent directement la
manière dont un programme traite les connexions réseau et la performance globale du système.
3.1. Communication Bloquante
La communication bloquante est un modèle où le thread qui effectue une opération de lecture
ou d'écriture sur une ressource (comme un socket ou un fichier) attend que cette opération se
termine avant de pouvoir continuer l'exécution du programme. En d'autres termes, le thread est
bloqué jusqu'à ce que l'opération réseau soit terminée, qu'il s'agisse de recevoir une réponse ou
d'envoyer des données.
3.1.1. Exemple en Java
Dans une communication bloquante, lorsqu'un thread tente de lire des données à partir d'un socket,
il est mis en pause jusqu'à ce que des données soient disponibles. Si aucune donnée n'est disponible,
le thread reste bloqué, et aucun autre traitement ne peut avoir lieu jusqu'à ce que la lecture soit
effectuée.
Voici un exemple de socket bloquant en Java :
import [Link];
import [Link];
import [Link];
import [Link];
[Link]();
[Link]();
}
}
Dans cet exemple, le serveur est bloqué à deux endroits :
TITRE DU RAPPORT 16
1. Lors de l'appel à accept() qui attend qu'un client se connecte.
2. Lors de l'appel à readLine() qui attend qu'une ligne de texte soit reçue du client.
Bien que la communication bloquante soit simple à mettre en œuvre, elle peut entraîner des
inefficacités. Par exemple, si une application serveur doit gérer de multiples connexions, chaque
thread pourrait rester bloqué en attente de données, ce qui consomme des ressources inutilement.
Cela rend la gestion de nombreuses connexions simultanées plus complexe et moins efficace.
3.1.2. Limitations de la Communication Bloquante
Ressources limitées : Chaque connexion nécessite un thread séparé, et chaque thread
bloque des ressources du système (CPU, mémoire).
Réactivité réduite : Si une connexion reste inactive ou lente, le thread reste bloqué, ce qui
peut ralentir l'ensemble du serveur.
Scalabilité difficile : Il devient difficile de maintenir des milliers de connexions
simultanées avec des threads bloquants, car la gestion des threads consomme beaucoup de
mémoire.
if ([Link]()) {
// Acceptation de la connexion client
SocketChannel clientChannel = [Link]();
[Link](false);
[Link](selector, SelectionKey.OP_READ);
[Link]("Client connecté.");
}
if ([Link]()) {
// Lecture des données du client
SocketChannel clientChannel = (SocketChannel) [Link]();
ByteBuffer buffer = [Link](256);
int bytesRead = [Link](buffer);
if (bytesRead == -1) {
[Link]();
} else {
String message = new String([Link]()).trim();
[Link]("Message reçu : " + message);
}
}
}
}
}
}
TITRE DU RAPPORT 18
3.2.3. Inconvénients
Complexité accrue : La gestion non bloquante introduit une plus grande complexité,
notamment dans la gestion des événements asynchrones et des états.
Programmation plus difficile : Le code devient plus difficile à écrire et à déboguer, en
particulier pour des cas d'utilisation complexes.
4. Topologies Réseau
La topologie réseau représente l'organisation ou la disposition physique ou logique des éléments
d'un réseau. En programmation réseau avec Java, les différentes topologies peuvent être mises en
œuvre à l'aide des sockets et des threads. Cette section présente les principales topologies réseau et
des exemples pratiques pour chacune, en utilisant Java pour simuler leur fonctionnement.
4.1. Topologie en Étoile (Star Topology)
Dans une topologie en étoile, tous les nœuds (clients) sont connectés à un nœud central (serveur). Le
nœud central gère et contrôle toutes les communications du réseau. Les clients ne communiquent
pas directement entre eux, mais passent par le serveur.
4.1.1. Exemple en Java (Serveur en Étoile)
Dans cet exemple, un serveur central accepte plusieurs connexions de clients et gère leurs
communications.
Code du Serveur :
import [Link].*;
TITRE DU RAPPORT 19
import [Link].*;
import [Link].*;
while (true) {
Socket clientSocket = [Link]();
[Link]("Client connecté.");
[Link](new GestionClient(clientSocket));
}
}
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new
InputStreamReader([Link]()));
PrintWriter out = new PrintWriter([Link](), true);
String message;
TITRE DU RAPPORT 20
public class ClientEtoile {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 1234);
BufferedReader in = new BufferedReader(new InputStreamReader([Link]()));
PrintWriter out = new PrintWriter([Link](), true);
[Link]("Bonjour Serveur");
[Link]("Réponse du serveur : " + [Link]());
[Link]();
}
}
Dans cet exemple, chaque client envoie un message au serveur qui est traité individuellement.
4.1.2. Avantages et Inconvénients
Avantages :
o Facile à implémenter et à gérer.
o Le serveur central peut contrôler tout le trafic.
o Si un client tombe en panne, le reste du réseau continue de fonctionner.
Inconvénients :
o Si le serveur central tombe en panne, tout le réseau est affecté.
o Peut être surchargé si trop de clients se connectent simultanément.
[Link]();
[Link]();
[Link]();
}
}
Chaque nœud reçoit un message du précédent, le modifie et le renvoie au suivant.
4.2.2. Avantages et Inconvénients
Avantages :
o Aucune dépendance sur un nœud central.
o Répartition égale de la charge entre les nœuds.
Inconvénients :
o Si un nœud tombe en panne, l'ensemble de l'anneau est affecté.
o Moins flexible, car il faut gérer manuellement la connexion entre chaque nœud.
while (true) {
Socket clientSocket = [Link]();
[Link](clientSocket);
new Thread(new GestionClientBus(clientSocket)).start();
}
}
TITRE DU RAPPORT 22
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new
InputStreamReader([Link]()));
String message;
TITRE DU RAPPORT 23
private static final int[] PEER_PORTS = {1235, 1236};
[Link]();
} catch (IOException e) {
[Link]();
}
});
}
[Link]();
}
}
TITRE DU RAPPORT 24
5. Introduction aux
Brokers et Systèmes de
Messagerie
Un broker de messages agit comme un intermédiaire entre les producteurs (qui envoient les
messages) et les consommateurs (qui reçoivent les messages). Il permet de découpler les
composants du système, les rendant plus flexibles, scalables et tolérants aux pannes.
5.1. Rôle du Broker de Messages
Le broker de messages gère plusieurs aspects clés du processus de messagerie :
1. Découplage des Composants : Le broker sépare les producteurs des consommateurs, de
sorte que ces derniers n'ont pas besoin d'être disponibles au même moment que les
producteurs. Cela favorise la souplesse et l'évolutivité dans les architectures distribuées.
2. Fiabilité : Le broker garantit que les messages sont livrés même si un consommateur est
temporairement indisponible. Il stocke les messages jusqu'à ce qu'ils soient consommés.
3. Scalabilité : En agissant comme un intermédiaire, le broker permet d'ajouter de nouveaux
consommateurs ou producteurs à la volée, sans interrompre la communication existante.
4. Tolérance aux pannes : Les systèmes de messagerie permettent d'ajouter une couche de
résilience. Par exemple, si un consommateur tombe en panne, les messages ne sont pas
perdus, car ils sont stockés temporairement par le broker.
5. Transmission Asynchrone : Les producteurs peuvent envoyer des messages à tout
moment sans attendre la réponse immédiate des consommateurs. Cela est particulièrement
utile dans des environnements où les composants ne peuvent pas toujours communiquer en
temps réel.
TITRE DU RAPPORT 25
Traitement des commandes e-commerce : Un broker permet de gérer les différentes
étapes d'une commande, comme la vérification de la disponibilité des produits, la gestion du
paiement, et l'envoi d'alertes de confirmation au client.
Systèmes de surveillance (Monitoring) : Dans les architectures distribuées, les
messages envoyés par des capteurs peuvent être collectés, filtrés, et distribués via un broker
de messagerie pour un traitement ou une analyse ultérieure.
Applications IoT : Dans l'Internet des objets (IoT), des capteurs ou dispositifs envoient
continuellement des données vers un broker qui les distribue ensuite à différentes
applications de traitement ou de stockage.
TITRE DU RAPPORT 26
// Démarrage des producteurs
new Thread(new Producer("Producteur 1")).start();
new Thread(new Producer("Producteur 2")).start();
// Classe Producteur
static class Producer implements Runnable {
private String name;
@Override
public void run() {
try {
for (int i = 0; i < 5; i++) {
String message = name + " - Message " + i;
[Link](name + " envoie : " + message);
[Link](message);
[Link](1000); // Simulation d'un délai
}
} catch (InterruptedException e) {
[Link]();
}
}
}
// Classe Consommateur
static class Consumer implements Runnable {
private String name;
@Override
public void run() {
try {
while (true) {
String message = [Link]();
[Link](name + " a reçu : " + message);
}
} catch (InterruptedException e) {
[Link]();
}
}
}
}
Dans cet exemple :
Producteur : génère des messages et les place dans une file d'attente (queue).
TITRE DU RAPPORT 27
Consommateur : récupère les messages de la file d'attente et les traite.
Cet exemple montre une architecture de base d'un système de messagerie, où les producteurs et
consommateurs ne sont pas directement liés, mais communiquent via une file d'attente partagée,
simulant le rôle d'un broker.
5.6. Conclusion
Les brokers et systèmes de messagerie sont des composants essentiels dans les architectures
distribuées modernes, assurant un découplage, une communication fiable, et une meilleure
scalabilité des systèmes. Leur utilisation est indispensable dans les environnements asynchrones, où
les composants doivent échanger des messages sans être directement connectés en temps réel. Ils
fournissent une flexibilité nécessaire pour gérer la communication à grande échelle et assurent la
résilience et la persistance des données à travers le réseau.
5.7. Notions de Topic, Queue et Exchange
Dans le cadre des systèmes de messagerie et des brokers, les concepts de Topic, Queue, et
Exchange sont essentiels pour comprendre comment les messages sont acheminés et distribués
entre les producteurs et les consommateurs. Chacun de ces concepts joue un rôle spécifique dans la
manière dont les messages sont organisés et livrés.
5.7.1. Queue
Une queue (file d'attente) est une structure de données dans laquelle les messages sont stockés
jusqu'à ce qu'ils soient consommés. Dans le modèle de messagerie basé sur les queues, un ou
plusieurs producteurs envoient des messages à une queue, et un ou plusieurs consommateurs les
récupèrent pour les traiter. Le principe fondamental des queues est généralement le FIFO (First In,
First Out), c'est-à-dire que les premiers messages envoyés sont les premiers à être consommés.
Exemple d'utilisation :
Traitement de tâches en arrière-plan : Les messages peuvent représenter des tâches à
exécuter (comme le traitement d'une image ou d'une transaction), et les consommateurs les
exécutent un par un.
Scalabilité : On peut ajouter plusieurs consommateurs pour répartir la charge de travail.
Une tâche sera attribuée à un seul consommateur.
Fonctionnement :
Propriétés :
TITRE DU RAPPORT 28
consommateurs peuvent recevoir le même message. Le producteur publie des messages sur un topic,
et tous les consommateurs abonnés à ce topic recevront les messages.
Exemple d'utilisation :
Notifications en temps réel : Imaginons une application de trading où les utilisateurs
souhaitent recevoir des mises à jour sur les actions en temps réel. Tous les utilisateurs
abonnés au topic recevront les informations sur les variations des cours boursiers.
Fonctionnement :
Propriétés :
TITRE DU RAPPORT 29
Illustration : Imaginons un système où les utilisateurs envoient des messages de différents
types (commandes, factures, notifications) vers un exchange. L'exchange les redirige ensuite
vers des queues appropriées en fonction du type de message.
// Exemple simplifié :
[Link]("Commande client", "queue_commande");
[Link]("Notification", "queue_notification");
String message = [Link](); // Le consommateur récupère les messages dans la queue associée.
[Link]("Traitement de " + message);
5.7.4. Comparaison entre Queue, Topic, et Exchange
Concept Modèle Propriétés Cas d'utilisation
Un message est consommé une Traitement de tâches,
Queue Point-à-point
seule fois, FIFO équilibrage de charge
Un message est diffusé à Notifications, diffusion de
Topic Publication/Abonnement
plusieurs abonnés mises à jour en temps réel
Route les messages selon des
Routage intelligent,
Exchange Routage de messages règles vers des queues
intégration de services
spécifiques
6. Réimplantation des
Protocoles de Couches
d'Application en
Sockets et Threads
Cette section aborde la réimplantation des principaux protocoles de communication utilisés dans les
applications modernes en s'appuyant sur les sockets et threads en Java. Cela permet de mieux
comprendre le fonctionnement sous-jacent des protocoles de la couche d'application en les
construisant à partir de zéro. Nous allons couvrir plusieurs protocoles comme REST, MQTT,
AMQP, CoAP, XMPP, Kafka, et STOMP, en expliquant leur structure et en proposant des
exemples d'implémentation.
6.1. Principes Fondamentaux des Protocoles de Couches
d'Application
Les protocoles de la couche d'application définissent les règles pour échanger des données entre des
applications via des réseaux. Ces protocoles se trouvent au sommet du modèle TCP/IP ou OSI et
facilitent la communication entre les processus au travers de différentes technologies.
En Java, la réimplantation de ces protocoles utilise les sockets pour établir des connexions, et les
threads pour gérer la concurrence et les requêtes simultanées.
TITRE DU RAPPORT 30
6.2. Réimplantation du Protocole REST avec Sockets et
Threads
REST (Representational State Transfer) est un protocole très utilisé pour les API web, basé
sur le protocole HTTP. Il repose sur une architecture stateless où les interactions entre client et
serveur se font via des requêtes HTTP.
Exemple d’implémentation REST :
L'idée est de créer un serveur socket qui écoutera sur un port et traitera les requêtes HTTP REST
envoyées par un client, répondant avec les données appropriées selon le verbe HTTP (GET, POST,
etc.).
// Serveur basique REST en Java
ServerSocket server = new ServerSocket(8080);
while (true) {
Socket client = [Link]();
new Thread(() -> handleRequest(client)).start();
}
while (true) {
Socket client = [Link]();
new Thread(() -> handleMQTTClient(client, topicSubscribers)).start();
}
TITRE DU RAPPORT 31
public void handleMQTTClient(Socket client, Map<String, List<Socket>> topicSubscribers) {
// Gérer la publication/souscription et la diffusion des messages aux clients abonnés
// Ici, chaque message publié est relayé aux abonnés du topic correspondant.
}
6.4. Réimplantation du Protocole AMQP
AMQP (Advanced Message Queuing Protocol) est un protocole pour la gestion de la
messagerie orientée file d'attente, souvent utilisé dans des contextes industriels avec RabbitMQ.
AMQP utilise des concepts comme les exchanges et queues pour router les messages.
Dans une réimplantation, un serveur socket agira comme un broker AMQP en permettant aux
clients de publier des messages dans des queues. Un thread distinct sera attribué à chaque client
pour gérer les connexions simultanées.
// Réimplantation AMQP simplifiée en Java
ServerSocket amqpServer = new ServerSocket(5672); // Port par défaut AMQP
Map<String, Queue<String>> queues = new HashMap<>();
while (true) {
Socket client = [Link]();
new Thread(() -> handleAMQPClient(client, queues)).start();
}
while (true) {
[Link](packet); // Recevoir la requête CoAP
new Thread(() -> handleCoAPRequest(packet)).start();
}
TITRE DU RAPPORT 32
ServerSocket xmppServer = new ServerSocket(5222); // Port par défaut XMPP
while (true) {
Socket client = [Link]();
new Thread(() -> handleXMPPClient(client)).start();
}
while (true) {
Socket client = [Link]();
new Thread(() -> handleSTOMPClient(client)).start();
}
TITRE DU RAPPORT 33
7. Clone et Ré-
implémentation
d'Applications de Chat
Dans cette section du cours, nous allons étudier et ré-implémenter certaines des applications de
messagerie les plus populaires tout en mettant l'accent sur les techniques et protocoles sous-jacents
utilisés dans chaque cas. Nous aborderons également les appels VoIP et les spécificités du protocole
UDP pour les communications en temps réel.
TITRE DU RAPPORT 35
1. Double ratchet algorithm : Implémentation de ce mécanisme pour le renouvellement
constant des clés de session.
2. Sécurisation des métadonnées : Utilisation de perfect forward secrecy pour éviter
que les messages interceptés puissent être déchiffrés ultérieurement.
3. Notifications sécurisées : Mise en place de notifications push sans divulguer de contenu
sensible (juste une mention générique de message reçu).
4. Chiffrement des appels vocaux et vidéo pour protéger l'intégralité des communications.
Outils et technologies recommandés :
Libsignal (bibliothèque open source de Signal) ou implémentation manuelle du double
ratchet.
WebRTC pour les appels vocaux et vidéo sécurisés.
TITRE DU RAPPORT 36
TITRE DU RAPPORT 37