Objets Distribués

publicité
Communication par diffusion :
Multicast
Serveur
Client1
application
Client2
Gr
application
Clientn
application
Ouvrir un socket =
demander à se Connecter
Les clients demandent seulement à joindre un groupe
Exemple de multicast
Un serveur de citation qui envoie une citation toutes les minutes
à tous les clients qui écoutent (multicast)
Scénario d’un serveur
Créer le socket d ’entrée
Créer un paquet de sortie
Préparer et Envoyer une donnée
Fermer le socket d ’entrée
Scénario d’un client
Créer le socket d ’entrée
Création d ’un paquet d ’entrée
Attente de données en entrée
Réception et traitement des données en
entrée
Fermer le socket d ’entrée
Classe MulticastServer
Des constructeurs : par défaut, port à utiliser
Des accesseurs en lecture : adresse du groupe (getInterface…)
Des méthodes : pour envoyer un paquet datagramme, pour
joindre ou quitter un groupe (send, joinGroup, leaveGroup)
Multicast: MulticastSocket
Type de socket utilisé côté client pour écouter des paquets que
le serveur « broadcast » à plusieurs clients. .
Une extension du QuoteServer :
broadcast à intervalle régulier à tous ses clients
Le serveur a un nouveau nom et crée un MulticastServerThread
qui contient le cœur du serveur.
import java.io.*;
public class MulticastServer {
public static void main(String[] args) throws IOException {
new MulticastServerThread().start();
}
}
public class MulticastServerThread extends QuoteServerThread {
...
}
utilisation du constructeur par héritage
et héritage de variables et de la méthode getNextQuote
Une nouvelle méthode RUN
public void run() {
while (moreQuotes) {
try { byte[] buf new byte[256];
// don't wait for request...just send a quote
String dString = null;
if (in == null) dString = new Date().toString();
else dString = getNextQuote();
buf = dString.getBytes();
InetAddress group = InetAddress.getByName("230.0.0.1");
DatagramPacket packet;
packet = new DatagramPacket(buf, buf.length, group, 4446);
socket.send(packet);
try {sleep((long)Math.random() * FIVE_SECONDS);
} catch (InterruptedException e) { }
} catch (IOException e) { e.printStackTrace();
moreQuotes = false;}
} socket.close();}
Différences principales
Le DatagramPacket est construit à partir de
de « l’adresse de plusieurs clients »
L ’adresse et le no de port sont câblés
no de port 4446 (tout client doit avoir un MulticastSocket lié à ce no).
L’adresse InetAddress "230.0.0.1" correspond à un identificateur de
groupe et non à une adresse Internet de la machine d’un client
Le DatagramPacket est destiné à tous les clients qui écoutent le port 4446
et qui sont membres du groupe "230.0.0.1".
Un nouveau Client
Pour écouter le port 4446, le programme du client doit créer son
MulticastSocket avec ce no.
Pour être membre du groupe "230.0.0.1" le client adresse la méthode
joinGroup du MulticastSocket avec l’adresse d’identification du groupe.
Le serveur utilise un DatagramSocket pour faire du broadcast à partir
de données du client sur un MulticastSocket. Il aurait pu utiliser aussi
un MulticastSocket. Le socket utilisé par le serveur pour envoyer le
DatagramPacket n’est pas important. Ce qui est important pour le
broadcast est d’adresser l’information contenue dans le DatagramPacket,
et le socket utilisé par le client pour l’écouter.
MulticastSocket socket = new MulticastSocket(4446);
InetAddress group = InetAddress.getByName("230.0.0.1");
socket.joinGroup(group);
DatagramPacket packet;
for (int i = 0; i < 5; i++) {
byte[] buf = new byte[256];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(packet.getData());
System.out.println("Quote of the Moment: " + received);
}
socket.leaveGroup(group);
socket.close();
Synthèse
Client
Serveur
I/O Stream
I/O Stream
TCP
connecté
aSocket
write
read
aServerSocket
read
write
aDatagramPacket
UDP
aDatagramSocket
non connecté
send
receive
Multicast
receive
send
aMulticastSocket
receive
aDatagramSocket
aDatagramSocket/
aMulticastSocket
send
Définir un nouveau type de
socket
Pourquoi ?
Préparer les données avant de les envoyer
Préparer les données reçues
Exemple
Java RMI
Sockets spécialisées (marshalling et unmarshalling)
Images : Compression et Décompression
Comment ?
En spécialisant les classes de base
Comment Définir un nouveau
type de Sockets
La classe CompressionSocket et ses classes relatives
4 étapes
1. Etendre java.io.FilterOutputStream
pour créer un output stream pour ce type de Socket.
Surcharge de méthodes si nécessaire.
2. Etendre java.io.FilterInputStream
3. Etendre java.net.Socket .
Implémenter les constructeurs appropriés et surcharger
getInputStream, getOutputStream et close.
4. Etendre java.net.ServerSocket
Implémenter le constructeur et surcharger accept
pour créer un socket du bon type.
Conclusion
Une large bibliothèque pour traiter les sockets et différents
types de communication entre Clients et Serveurs dans
Java
Une extension naturelle par abstraction à l’appel de
méthodes à distance - Java RMI
et une normalisation Corba avec l’intégration d’un ORB
et maintenant les EJB : Entreprise Java Beans
et JINI …..
Retour sur RMI
Exemple
CLIENT Essifun
SERVEUR de Surnoms
oter
infrastructure
Communication client serveur
CLIENT
Connexion au serveur
Préparation de la requête
Envoi de la requête
Attente du résultat
….
Analyse du résultat reçu
SERVEUR
Attente de requêtes
Analyse de la requête
…..
Exécution
….
Préparation de la réponse
Envoi de la réponse
Exemple : annuaire des surnoms
1:Paul:bug ou ENR/nPaul/n/bug/n ou Objet Requête Seriablizable
EssiFun
SERVEUR de Surnoms
enregistrer(« paul », »bug »)
marshalling 0111000101000..
unmarshalling
TRUE
101..
unmarshalling
enregistrer(« paul », »bug »)
TRUE
marshalling
Que peut on automatiser ?
Au minimum, la phase de marshalling/unmarshalling
(hétérogéneité des langages, des systèmes, etc)
Selon les cas, le squelette du serveur
les appels distants du client
Exemple : annuaire des surnoms
et RMI
AnnuaireEssi
listePersonnes
Enregistrer(AnneMarie,AM)
lister()
enregistrer
lister
oter
Exemple : annuaire des surnoms
• interface : partie visible de l’objet
(enregistrer, oter, lister, …)
• implémentation : partie privée inaccessible
depuis d’autres objets (listePersonnes : un
vecteur de Personne ou un tableau ou ….)
• interface = contrat entre l’objet et le monde
extérieur (save impossible par exemple)
RMI
public interface Surnoms extends java.rmi.Remote
{
public Boolean enregistrer(String nom, String surnom) throws
java.rmi.RemoteException,
ServeurSurnoms.surnoms.ExisteDeja ;
….
}
Générateurs
Spécifications
des données
Int. Java
IDL
Générateurs
RMIC / Orbix...
Fichiers
générés
Stubs Skeletons Proxy
(mise en œuvre de la sérialisation
et désérialisation…)
RMI
Classes et Interfaces
Machine locale
Machine distante
InterfaceDistante
InterfaceDistante
Souche
Squelette
Appel méthode m()
Appel méthode m()
ClasseLocale
Remote
ClasseDistante
Interaction Client Enregistreur
Lookup : où est objetDistant ?
client
registre
Il est ici
result
Envoyez le stub
stub
Le voici
stub
result = objetDistant.m()
squelette
objet
Distant
RMIRegistry + ClassLoader
client
serveur
Exemple : annuaire des surnoms
ASN.1
et
norme
ISO
Protocole := CHOICE {
enregistrerReq [0] SEQUENCE{PrintableString nom,
PrintableString surnom}
enregistrerRep[1] BOOLEAN,
listerReq [2] NULL,
listerRep [3] SET OF Personnes, ….}
XDR et
RPC
de
SUN
Programme surnoms {
version {
boolean enregistrer(nomSurnom) = 1;
listePersonnes lister(void)=2
}= 1
} = 10000
Générateurs de Stubs
Spécifications
des données
XDR
ASN1
Générateurs
RPCGEN / MAVROS
Fichiers Types de
générés données
C Lisp
Java
Librairie marshalling
et unmarshalling
squelettes du client et
du serveur
Types de
données
C
Les points communs des
approches distribuées
Adressage :
à tout serveur (objet ou programme)
doit être affecté une référence unique
Transport :
pour établir une communication entre 2 nœuds
et transmettre une requête
Marshalling :
transformation de la requête pour passer sur le
réseau
points communs
Protocol :
transmission des requêtes entre exécutables
Dispatching :
gestion des threads
Des services communs
Services de nommage
Interface repository
.....
Reste à approfondir
Communication réseaux et Internet
Couches de transport
Différences entre UDP et TCP
(Développement d’un serveur multicast Ack/NoAck pour gérer la
perte des paquets UDP)
D’autres protocoles (RTP/RTCP)
(introduction du routage multicast ou du tunelling)
principes du IP / protocole ICMP
Service de nommage
DNS Configuration services réseau, routage IP et DNS d’une machine
Spécificités des Réseaux Locaux
Introduction au Réseaux Locaux LANs
Configuration carte réseau d’une
machine,
Réseaux
Rseaux
Locaux
Locaux
Développement d’un analyseur de trafic
et standards IEEE 802 : IEEE 802.3 et Ethernet
TD 7 : Configuration d’un Firewall : IPTables,
Développement d’un analyseur de trafic (suite) (101)
Réseaux Locaux cours 6 : Introduction aux LANs et standards IEEE 802
TD 6 : Configuration carte réseau d’une machine,
Développement d’un analyseur de trafic
Réseaux Locaux cours 7 : IEEE 802.3 et Ethernet
TD 7 : Configuration d’un Firewall : IPTables,
Développement d’un analyseur de trafic (suite) (101)
Réseaux Locaux cours 8 : IEEE 802.3 et Ethernet
TP Evalué
La communication réseaux et Internet
Internet cours 1 : IP
TD 1 : Introduction aux sockets BSD (et winsock sous windows) (NNN)
Internet cours 2 : TCP/UDP
TD 2 : Développement d’un serveur multicast Ack/NoAck pour gérer la
perte des paquets UDP (NNN)
Internet cours 3 : TCP/UDP (suite) et exemple d’autres protocoles (RTP/RTCP)
TD 3 : Développement d’un serveur multicast Ack/NoAck (suite),
introduction du routage multicast ou du tunelling (NNN)
Internet cours 4 : Routage IP / protocole ICMP
TD 4 : Programmation du ping (messages ICMP) + export (JNI) en Java
Internet : cours 5 : DNS
TD 5 : Configuration services réseau, routage IP et DNS d’une machine
Réseaux Locaux cours 6 : Introduction aux LANs et standards IEEE 802
TD 6 : Configuration carte réseau d’une machine,
Développement d’un analyseur de trafic
Réseaux Locaux cours 7 : IEEE 802.3 et Ethernet
TD 7 : Configuration d’un Firewall : IPTables,
Développement d’un analyseur de trafic (suite) (101)
Réseaux Locaux cours 8 : IEEE 802.3 et Ethernet
TP Evalué
Conclusion
• Problèmes d’intégration et d’interopérabilité
entre le monde Microsoft et le reste
• Arrivée de internet
– Effort d’interopérabilité et d’efficacité
– RMI et Corba en Java
• Des nouveautés avec les composants
– les Enterprise Java Beans
– Corba Components
– et aussi C# et net
Affaire à suivre
Quelques interrogations ?
Comment choisir le bon middleware (intergiciel) ?
Il y en a de plus en plus
Corba, RMI, DCOM, DSA + CCM, J2EE
+ Web Services, .net ....
Savoir les comparer
Identifier les points communs
Interopérabilité : XML une solution suffisante ?
Des Critères de Comparaisons
Autour du concept objet ?
Communication synchrone ou asynchrone ?
Description via des interfaces ou des messages ?
Communication directe ou indirecte ?
Spécifique ou indépendant langage ?
Possibilité de transformation de messages ou non ?
Protocole de communication binaire ou textuelle ?
Prise en compte de QoS ou non ?
(transaction, sécurité ....)
Comment faire interopérer les
middlewares ?
Aller vers un middleware standard ?
(J2EE / Corba)
Construire une couche au dessus des middlewares ?
des familles de middlewares, des middlewares
génériques (Jonathan, PolyOrb, ...)
Avoir une approche architecturale ?
des design patterns
Faire interopérer des middlewares existants?
M2M
L’avenir ?
Après les approches par composants,
des middlewares au dessus de JMS
Une réflexion de plus haut niveau pour
sortir les schémas communs
extérioriser quand et comment on les utilise
ne pas confondre les problèmes avec XML
Les points communs des
middlewares en objets distribués
Adressage :
à tout objet doit être affecté une référence unique
Transport :
pour établir une communication entre 2 nœuds
et transmettre une requête
Marshalling :
transformation de la requête pour passer sur le
réseau
Protocol :
transmission des requêtes entre exécutables
Les points communs des
middlewares en objets distribués
Activation :
activer les implémentations des objets
Dispatching :
gestion des threads
Des services communs
Services de nommage
Interface repository
.....
Un bref comparatif
Origine
Microsoft
OMG
JavaSoft
Archi
COM
DCOM
IDL ORB
IIOP
Java RMI
Applet
Interfaces IUNKnown Définies en
prédéfinies IDL
Définies en
Java
Un bref comparatif
Interface+ Agrégation Héritage
composition
Héritage
extends
Langage
C++
C C++
Smalltalk
Java
Infrastr.
Proxy
stub
Stub
skeleton
Proxy
RO
Un bref comparatif
Serveur
Appli
DLL
Appli
Biblio
BDD
Appli Java
Client
Appli
DLL
Appli
Biblio
BDD
Appli Java
Applets
Création
IFactory
Instancié
en LOO
Instancié
En Java
Un bref comparatif
Appel
dyn.
IDispatch
DII
Introsp.
beans
Ident.
Reg. OLE
Service de
nommage
URL
Comm.
DCOM
DCE
IIOP
RMI
(TCP/IP)
Conclusion
• Problèmes d’intégration et d’interopérabilité
entre le monde Microsoft et le reste
• Arrivée de internet
– Effort d’interopérabilité et d’efficacité
– RMI et Corba en Java
• Des nouveautés avec les composants
– les Enterprise Java Beans
– Corba Components
– et aussi C# et net
Affaire à suivre
Téléchargement