21/10/2024
Applications réparties
Socket-RMI
PRÉSENTÉ PAR NISSEN MASMOUDI
© AU: 2024-2025
Définition
Une application monolithique est une seule unité de déploiement dans laquelle toutes les
fonctionnalités (interfaces utilisateur, logique métier, accès aux données, etc.) sont regroupées et
gérées dans une seule base de code. L'application fonctionne généralement comme un seul processus.
Une application répartie est une architecture dans laquelle les différents composants de l’application
(ex. services métiers, bases de données) sont séparés et peuvent être distribués sur plusieurs serveurs
ou machines. Cette architecture est souvent associée à des systèmes de micro services où chaque
service est indépendant et interagit avec les autres via des protocoles réseau.
DÉVELOPPEMENT RÉPARTIE 2
21/10/2024
Architectures d’application répartie
L'architecture client-serveur est un modèle où plusieurs clients (souvent des applications sur des
ordinateurs distants) envoient des requêtes à un serveur centralisé, qui traite les demandes et envoie
des réponses:
Clients : Les clients peuvent être des navigateurs web, des applications mobiles ou des programmes lourds. Ils
envoient des requêtes au serveur pour accéder à des ressources ou effectuer des opérations.
Serveur : Le serveur central gère la logique métier et traite les requêtes reçues des clients. Il peut interagir
avec une base de données pour stocker ou récupérer des informations.
DÉVELOPPEMENT RÉPARTIE 3
Architectures d’application répartie
L'architecture à Trois tiers est une évolution de l'architecture client-serveur, divisant les
responsabilités en trois couches distinctes :
Client (Interface utilisateur) : Il s'agit de l'interface utilisateur avec laquelle l'utilisateur interagit, souvent un
navigateur web ou une application mobile.
Serveur d'application (Logique métier):Il traite les requêtes et contient la logique métier. Il sert de passerelle
entre le client et la base de données.
Serveur de base de données (Stockage):Gère le stockage et la récupération des données.
DÉVELOPPEMENT RÉPARTIE 4
21/10/2024
Architectures d’application répartie
L'architecture à Multi tiers fait référence à la distribution physique des composants d'une
application sur plusieurs serveurs ou machines distinctes, chacun jouant un rôle spécifique dans
l'exécution de l'application. Contrairement à une architecture logique où la séparation est
fonctionnelle (couche de présentation, logique métier, données).
DÉVELOPPEMENT RÉPARTIE 5
Architectures d’application répartie
L'architecture à Multi tiers fait référence à la distribution physique des composants d'une
application sur plusieurs serveurs ou machines distinctes, chacun jouant un rôle spécifique dans
l'exécution de l'application. Contrairement à une architecture logique où la séparation est
fonctionnelle (couche de présentation, logique métier, données). Exemple d’architecture quatre tiers :
Client (Tier 1) : est l'interface utilisateur qui interagit avec le système. Exemple : Un navigateur web qui accède
à une application web hébergée sur un serveur distant.
Serveur de Présentation (Tier 2 - Serveur Web) : reçoit les requêtes du client et les traite. Il gère généralement
la logique de présentation, les requêtes HTTP, et transmet les requêtes à la couche métier ou base de données.
Exemple : Un serveur Apache ou Nginx exécutant une application web (comme un back-end Spring Boot ou
Django).
DÉVELOPPEMENT RÉPARTIE 6
21/10/2024
Architectures d’application répartie
Exemple d’architecture quatre tiers (suite) :
Serveur d'Application : traite la logique métier et gère les requêtes complexes, interagit avec la base de
données et effectue les calculs ou les règles métiers. Exemple : Un serveur Java EE ou [Link] qui contient les
API REST.
Serveur de Base de Données (Tier 4 ) : stocke toutes les données persistantes et répond aux requêtes de la
couche métier ou de présentation. Il est souvent isolé pour des raisons de sécurité et de performance.
Exemple : Un serveur MySQL ou PostgreSQL.
DÉVELOPPEMENT RÉPARTIE 7
Définition d’un socket
Un socket est un objet logiciel qui représente un point d'extrémité pour envoyer ou recevoir
des données à travers un réseau. Il est identifié par une adresse IP et un numéro de port. Un
socket peut être considéré comme une combinaison de ces deux éléments :
Adresse IP : identifie une machine dans le réseau.
Port : identifie un service ou une application spécifique sur cette machine.
DÉVELOPPEMENT RÉPARTIE 8
21/10/2024
Type de sockets
Socket TCP (Stream Socket) :
Permet des connexions fiables et orientées connexion.
Garanti la livraison des messages dans l'ordre.
Utilisé pour des applications où la fiabilité est primordiale, comme le transfert de fichiers, les services HTTP, etc.
Socket UDP (Datagram Socket) :
Offre une communication non fiable et sans connexion
Les messages (datagrammes) peuvent arriver dans le désordre ou être perdus.
Utilisé pour des applications où la rapidité est plus importante que la fiabilité, comme les jeux en ligne ou le
streaming.
DÉVELOPPEMENT RÉPARTIE 9
Rôle des sockets
Dans une architecture distribuée, les sockets facilitent :
La communication entre un client et un serveur pour des requêtes/réponses (par exemple, dans un
modèle client-serveur).
Les communications pair-à-pair où chaque entité peut être à la fois client et serveur.
Le développement de systèmes en temps réel ou des systèmes à haute disponibilité nécessitant des
connexions réseaux efficaces.
DÉVELOPPEMENT RÉPARTIE 10
21/10/2024
Exemples
Serveurs Web : Utilisent des sockets pour accepter des connexions TCP depuis des navigateurs
web (clients).
Applications de messagerie instantanée : S'appuient sur des sockets pour maintenir une
connexion en temps réel entre les utilisateurs.
Applications de streaming : Utilisent les sockets UDP pour diffuser du contenu en minimisant la
latence.
DÉVELOPPEMENT RÉPARTIE 11
Communication entre les applications
réparties
Machine 1 TCP/IP ou UDP Machine 2
Application1 Application2
Technologies d’accès :
• Sockets ou DataGram
• RMI (JAVA)
• CORBA (Multi Langages)
• EJB (J2EE)
• Web Services (HTTP+XML)
DÉVELOPPEMENT RÉPARTIE 12
21/10/2024
Principe de bases
Création d’un serveur:
Création d’un client : ServerSocket ss=new ServerSocket(1234);
Socket s=[Link]();
Socket s=new Socket("[Link]",1234)
InputStream is=[Link]();
InputStream is=[Link](); OutputStream os=[Link]();
OutputStream os=[Link](); int nb=[Link]();
[Link](23); int rep=nb*2;
int rep=[Link](); [Link](rep);
[Link](rep);
ss:ServerSocket
Connexion port=1234
accept():Socket
s:Socket s:Socket
write read
getOutpuStream() os is getInpuStream()
getInPutStream() is os getOutPutStream()
read write
APPLICATIONS RÉPARTIES 13
Exemple d’un
serveur import [Link].*;import [Link].*;
public class Serveur {
public static void main(String[] args) {
try {
ServerSocket ss=new ServerSocket(1234);
[Link]("j'attend la connexion d'un client");
Socket clientSocket=[Link]();
[Link]("Nouveau client connecté");
[Link]("Génération de objet InptStream et
OutputStream de la socket");
InputStream is=[Link]();
OutputStream os=[Link]();
[Link]("J'attend un nombre (1 octet)!");
int nb=[Link]();
[Link]("J'envoie la réponse");
[Link](nb*5);
[Link]("Déconnexion du client");
[Link]();
} catch (IOException e) {
[Link]();
} APPLICATIONS RÉPARTIES
14
}
21/10/2024
Exemple
d’un Client import [Link].*;import [Link].*;import [Link];
public class Client {
public static void main(String[] args) {
try {
[Link]("Créer une connexion au serveur:");
Socket clientSocket=new Socket("[Link]", 123);
[Link]("Génération de objet InptStream et OutputStream
de la socket");
InputStream is=[Link]();
OutputStream os=[Link]();
[Link]("Lire un nombre au clavier NB=");
Scanner clavier=new Scanner([Link]);
int nb=[Link]();
[Link]("Envoyer le nombre "+nb+" au serveur");
[Link](nb);
[Link]("Attendre la réponse du serveur:");
int rep=[Link]();
[Link]("La réponse est :"+rep);
} catch (Exception e) {
[Link]();
}
}
} APPLICATIONS REPARTIES 15
Exécution
APPLICATIONS REPARTIES 16
21/10/2024
Création de l’objet ServerSocket
Envoie et réception des ServerSocket ss=new ServerSocket(2345);
chaines de caractères Attendre une connexion d’un client
Socket sock=[Link]();
Pour lire une chaîne de caractère envoyée par le client :
InputStream is=[Link]();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String s=[Link]();
Pour envoyer une chaîne de caractères au client
OutputStream os=[Link]();
PrintWriter pw=new PrintWriter(os,true);
[Link]("Chaîne de caractères");
Lire is:InputStream Isr:InputStreamReader br:BufferedReader
read():int read():int readLine():String
Envoyer os:OutputStream pw:PrintWriter
[Link] | Université Hassan II
Mohammedia
wrire(int c):void println(String s):void
APPLICATIONS RÉPARTIES 17
Exemple (Serveur)
public class Serveur {
public static void main(String[] args) throws IOException {
[Link]("Je suis le serveur");
ServerSocket ss= new ServerSocket(1234);
Socket s =[Link]();
[Link]("Je suis le serveur, j'ai intercepter un client");
InputStream is =[Link]();
OutputStream os =[Link]();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr );
String mot_recu=[Link]();
[Link]("J'ai recu le mot : "+mot_recu);
int res= mot_recu.length();
[Link](res);
[Link]("j'ai transmis :"+res);
}
DÉVELOPPEMENT RÉPARTIE 18
21/10/2024
Exemple (Client)
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
[Link]("Je suis le Client concurent avec les autres ");
Socket client = new Socket("[Link]", 1234);
InputStream is =[Link]();
OutputStream os =[Link]();
String mot = "BAKLOUTI CHAHD";
PrintWriter pw=new PrintWriter(os,true);
[Link](mot);
int resultat = [Link]();
[Link]("La taille du mot est "+ resultat);
}
}
DÉVELOPPEMENT RÉPARTIE 19
Exercice d’application (TD)
Ecrire une application Java cliente qui :
Envoie le nom et prénom d’un étudiant
Reçoi depuis le serveur : OK si l’étudiant existe;Not OK sinon.
Ecrire une application Java serveur qui :
Reçoi le prénom et le nom d’un étudiant. Puis il vérifie son existance dans une table appelé etudiant(
prenomnom ) et enregistre dans une table appelé presence( # prenomnom, dateheureJour ).
Envoie les valeurs suivantes :OK si l’étudiant existe;Not OK sinon.
Note : on dispose une base de données MySQL soit dbscolarite contenant les tables suivantes :
•etudiant( prenomnom )
•presence(id, #prenomnom, dateheureJour )
DÉVELOPPEMENT RÉPARTIE 20
21/10/2024
Base de données MySQL
CREATE TABLE `etudiant` (
`prenom` varchar(255) NOT NULL ,
PRIMARY KEY (`prenom`)
);
CREATE TABLE `presence` (
`id` int NULL AUTO_INCREMENT ,
`prenom` varchar(255) NULL ,
`dateheurejour` datetime NULL ,
CONSTRAINT `fk_presence_etudiant` FOREIGN KEY (`prenom`) REFERENCES `etudiant` (`prenom`)
ON DELETE NO ACTION ON UPDATE NO ACTION
);
DÉVELOPPEMENT RÉPARTIE 21
Eléments de correction
DÉVELOPPEMENT RÉPARTIE 22
21/10/2024
Extrait code java (JDBC)
static final String DB_URL = "jdbc:mysql://localhost/dbscolarite";
static final String USER = "root";
static final String PASS = "";
static final String QUERY = "SELECT * FROM etudiant";
public static void main(String[] args) throws SQLException {
// Open a connection
Connection conn = [Link](DB_URL, USER, PASS);
Statement stmt = [Link]();
// String sql_delete = "delete from etudiant where prenom='BAKLOUTI CHAHD'";
// [Link](sql_delete);
// String sql_insert = "insert into etudiant values('BAKLOUTI CHAHD')";
// [Link](sql_insert);
//insert presence (prenom,dateheurejour) VALUES ('BAKLOUTI CHAHD',now());
String sql_update = "update etudiant set sexe=0 where prenom ='BAKLOUTI CHAHD' ";
[Link](sql_update);
ResultSet rs = [Link](QUERY);
String etudiant="";
while ([Link]()) {
if ([Link]("sexe")==false)
etudiant="Mme";
else
etudiant="M.";
[Link]("- "+etudiant+ " "+ [Link]("prenom") );
}
}
DÉVELOPPEMENT RÉPARTIE 23
R/E des objets Une classe Sérializable:
public class Voiture implements Serializable{
(Sérialisation et désérialisation) String mat;int carburant;
public Voiture(String m, int c) { mat=m; carburant=c;}
}
Pour sérialiser un objet (envoyer un objet vers le client)
OutputStream os=[Link]();
ObjectOutputStream oos=new ObjectOutputStream(os);
Voiture v1=new Voiture("v212",50);
[Link](v1);
Pour lire un objet envoyé par le client ( désérialisation)
InputStream is=[Link]();
ObjectInputStream ois=new ObjectInputStream(is);
Voiture v=(Voiture) [Link]();
Lire is:InputStream ois:ObjectInputStream
read():int readObject():Object
Envoyer os:OutputStream oos:ObjectOutputStream
[Link] | Université Hassan II
Mohammedia
wrire(int c):void writeObject(Object o):void APPLICATIONS RÉPARTIES
DÉVELOPPEMENT RÉPARTIE 24