Dis papa, c est quoi un bus logiciel réparti?



Documents pareils
RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Remote Method Invocation (RMI)

Programmer en JAVA. par Tama

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Remote Method Invocation Les classes implémentant Serializable

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Gestion distribuée (par sockets) de banque en Java

Calcul Parallèle. Cours 5 - JAVA RMI

Synchro et Threads Java TM

TP1 : Initiation à Java et Eclipse

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

RMI le langage Java XII-1 JMF

Remote Method Invocation en Java (RMI)

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

INITIATION AU LANGAGE JAVA

Java DataBaseConnectivity

OpenPaaS Le réseau social d'entreprise

Programmation Par Objets

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Plan du cours. Historique du langage Nouveautés de Java 7

Une introduction à Java

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Objets et Programmation. origine des langages orientés-objet

Java Licence Professionnelle CISII,

Auto-évaluation Programmation en Java

Premiers Pas en Programmation Objet : les Classes et les Objets

Composants Logiciels. Le modèle de composant de CORBA. Plan

Corrigé des exercices sur les références

Intergiciel - concepts de base

Chapitre VI- La validation de la composition.

Java Naming and Directory Interface

Introduction au langage Java

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Programmation Internet en Java

as Architecture des Systèmes d Information

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

2 Chapitre 1 Introduction

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Cahier des Charges du Projet Domotique. Choquet Mathieu Masson Jérôme Groupe 6. Domotique. p.1

PROGRAMMATION PAR OBJETS

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Threads. Threads. USTL routier 1

Environnements de développement (intégrés)

Projet de programmation (IK3) : TP n 1 Correction

Programmation client-serveur sockets - RPC

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Projet gestion d'objets dupliqués

Création d une application JEE

Développement Logiciel

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Langage Java. Classe de première SI

La base de données XML exist. A. Belaïd

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Architecture Orientée Service, JSON et API REST

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Programmation répartie RPC & RMI

Initiation à JAVA et à la programmation objet.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programme Compte bancaire (code)

Package Java.util Classe générique

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Utilisation d objets : String et ArrayList

OS Réseaux et Programmation Système - C5

ACTIVITÉ DE PROGRAMMATION

Flux de données Lecture/Ecriture Fichiers

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

TD/TP PAC - Programmation n 3

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Intergiciels pour la répartition CORBA : Common Object Request Broker. Patrice Torguet torguet@irit.fr Université Paul Sabatier

Arbres binaires de recherche

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Une introduction à la technologie EJB (2/3)

Introduction au langage C

Généralités sur le Langage Java et éléments syntaxiques.

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Un ordonnanceur stupide

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Protocole SSH-2.0. Tuan-Tu, TRAN. Janvier 2009

Corrigés des premiers exercices sur les classes

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

Bases Java - Eclipse / Netbeans

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Lier Erlang avec d autres langages de programmation

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Programmation Réseau SSH et TLS (aka SSL)

Transcription:

Dis papa, c est quoi un bus logiciel réparti? Raphael.Marvie@lifl.fr LIFL IRCICA Equipe GOAL Octobre 2006 10. Des sockets aux bus logiciels répartis

1 0. Une application répartie

2 Objectif Découvrir la notion et l architecture d un bus logiciel réparti, en concevant un petit bus simple from scratch. Construire un bus logiciel en 10 étapes : Chaque étape est un raffinement de la précédente Etape i + 1 = meilleure structuration de l étape i

3 Les services Service 1 : Hello world Une méthode hello avec un paramètre de type chaîne et retourne une chaîne : hello, + paramètre Deux méthodes lower et upper qui retournent le paramètre de type chaîne en minuscule ou majuscules Service 2 : Nombres premiers Calcule si un nombre est premier et retourne un booléen Calcule le carré d un nombre passé en paramètre Calcule la division de deux nombres passés en paramètre

4 1. Au début était la socket

5 Principe Deux programmes écrits en deux classes Java Une pour le serveur Server.java Une pour le client Client.java Dans chaque classe est implémenté Le code fonctionnel : manipulation des chaînes Le code technique : construction / analyse des messages réseau

6 Architecture version 1 Client Server Réseau

7 Interactions version 1 Client Server Servant connect () send (request) send (response)

8 Côté serveur Initialisation du réseau Instanciation d une socket serveur Gestion des requêtes Attente de connexion (accept) Initialisation des flux d entrée et de sortie Evaluation des requêtes Lecture de la requête sur le flux d entrée Création de la chaîne à retourner Ecriture de la réponse sur le flux de sortie

9 Code serveur (i) package step1 ; import java.io.* ; import java.net.* ; public class Server { private ServerSocket asock ; public Server () throws Exception { this.asock = new ServerSocket (12345) ; public static void main (String args[]) { Server s = new Server () ; s.run () ;

10 Code serveur (ii) public void run () throws Exception { while (true) { Socket sock = this.asock.accept () ; BufferedReader in = new BufferedReader (new InputStreamReader(sock.getInputStream ())); DataOutputStream out = new DataOutputStream (sock.getoutputstream ()); String msg = in.readline () ; String res = "Hello, " + msg + "\n" ; // fonctionnel out.writebytes (res) ;

11 Côté client Initialisation du réseau Instanciation d une socket de communication (connexion implicite) Gestion de l échange réseau Initialisation des flux d entrée et de sortie Demande de service Ecriture de la requête sur le flux de sortie Lecture de la réponse sur le flux entrée Affichage de la chaîne retournée Fermeture de la connexion

12 Code client (i) package step1 ; import java.io.* ; import java.net.* ; public class Client { private Socket sock ; public Client () throws Exception { this.sock = new Socket ("localhost", 12345) ; public static void main (String args[]) throws Exception { Client c = new Client () ; c.run (args[0]) ;

13 Code client (ii) public void run (String msg) throws Exception { BufferedReader in = new BufferedReader (new InputStreamReader(this.sock.getInputStream ())); DataOutputStream out = new DataOutputStream (this.sock.getoutputstream ()); out.writebytes (msg + "\n") ; String res = in.readline () ; System.out.println ("Server replied: " + res) ; this.sock.close();

14 Bénéfices et limitations Bénéfices Invocation d un service distant (hello world) Permet de réaliser des applications client / serveur Limitations Une seule connexion cliente à la fois Beaucoup de code très technique / peu de code métier (40 lignes de code technique pour une ligne de code métier) Un beau plat de spaghetti, non objet et difficilement évolutif

15 2. Gestionnaire de connexions

16 Principe Du côté serveur Etablissement de la connexion par le serveur (accept) La gestion de la connexion est déléguée Apparition d un objet Manager qui gère une connexion Du côté client Rien ne change pour le moment Réutilisation du client de l étape 1

17 Architecture version 2 Client Manager Réseau

18 Interactions version 2 Client Server Manager Servant create () connect () process (sock) send (request) send (response)

19 Côté serveur (Serveur) Intialisation De la socket d administration / serveur Création d un manager de connexions Gestion des requêtes Attente de connexion Délégation au manager

20 Côté serveur (Manager) Initialisation Rien de spécial Gestion des requêtes Initialisation du flux d entrée et de sortie Evaluation de la requête Lecture de la requête sur le flux entrée Création de la chaîne à retourner Ecriture de la réponse sur le flux de sortie

21 Code Serveur (i) package step2 ; import java.io.*; import java.net.*; public class Server { private ServerSocket asock ; private Manager mgr ; public Server () throws Exception { this.asock = new ServerSocket (12345) ; this.mgr = new Manager () ;

22 Code Serveur (ii) public void run () throws Exception { while (true) { Socket sock = this.asock.accept () ; this.mgr.process (sock) ; public static void main(string argv[]) throws Exception { Server s = new Server () ; s.run () ;

23 Code Manager package step2 ; import java.io.* ; import java.net.* ; public class Manager { public Manager () throws Exception { public void process (Socket sock) throws Exception { BufferedReader in =... DataOutputStream out =... String msg = in.readline () ; String res = "Hello, " + msg + "\n" ; out.writebytes (res) ;

24 Bénéfices et limitations Bénéfices Ebauche de structuration Distinction entre établir une connexion et la gérer Limitations Le manager ne sait répondre qu à une invocation Le code n est pas encore objet (i.e. le service)

25 3. Décodage des requêtes

26 Principe Côté serveur Le manager propose plusieurs services Le manager gère plusieurs requêtes par connexion Côté client Utilise les services séquentiellement Réalise plusieurs invocations avec la même connexion

27 Architecture version 3 Client Manager Réseau

28 Interactions version 3 Client Server Manager Servant create () connect () process (sock) send (request) send (response) send (request) send (response) send (request) send (response)

29 Côté serveur Gestion des requêtes par le Manager Initialisation des flux d entrée et de sortie Evaluation de la requête Lecture de la requête sur flux d entrée Décodage de la requête (quel service?) requête = numéro de service + arguments Evaluation du service demandé Ecriture de la réponse sur flux de sortie

30 Code Manager (i) public void process (Socket sock) throws Exception { BufferedReader in =... DataOutputStream out =... while (true) { String msg = in.readline () ; if (msg == null) // end of client connexion break ; String res ; switch (msg.charat (0)) {

31 Code Manager (ii) case 0 : res = "hello, " + msg.substring (1) + "\n" ; break ; case 1 : res = msg.substring (1).toLowerCase () + "\n" ; break ; case 2 : res = msg.substring (1).toUpperCase () + "\n" ; break ; default: res = "Unknown operation requested" ; out.writebytes (res) ;

32 Côté client Initialisation du réseau Instanciation de la socket de communication Gestion des échanges réseaux Intialisation des flux d entrée et de sortie Demande de service (x3) Requête réseau = numéro de service + arguments Ecriture requête, lecture réponse et affichage Fermeture de la connexion

33 Code Client (i) public void run (String msg) throws Exception { BufferedReader in =... DataOutputStream out =... String res ; out.writebytes ("0" + msg + "\n") ; res = in.readline () ; System.out.println ("Server replied (hello): " + res) ;

34 Code Client (ii) out.writebytes ("1" + msg + "\n") ; res = in.readline () ; System.out.println ("Server replied (lower): " + res) ; out.writebytes ("2" + msg + "\n") ; res = in.readline () ; System.out.println ("Server replied (upper): " + res) ; this.sock.close();

35 Bénéfices et limitations Bénéfices Un seul serveur propose plusieurs services Utilisation d une seule connexion par client Limitations Le code du service n est toujours pas objet Le code client est toujours un plat de spaghetti

36 4. Passage à un service objet

37 Principe Côté serveur Le service est implémenté comme un objet : le Servant Le manager est dédié au réseau décode les requêtes invoque le Servant Côté client Rien ne change

38 Architecture version 4 Client Servant Manager Réseau

39 Interactions version 4 Client Server Manager Servant create () create (servant) connect () process (sock) send (request) hello (str) send (response)

40 Côté serveur Initialisation du Manager dans le serveur Passage du Servant comme paramètre Gestion des requêtes par le Manager Initialisation des flux Evaluation des requêtes lecture et décodage de la requête invocation du Servant écriture de la réponse

41 Code Server public class Server { private ServerSocket asock ; private Manager mgr ; public Server () throws Exception { this.asock = new ServerSocket (12345) ; this.mgr = new Manager (new Servant ()) ; // unchanged

42 Code Servant public class Servant { public String hello (String msg) { return "hello, " + msg ; public String lower (String msg) { return msg.tolowercase () ; public String upper (String msg) { return msg.touppercase () ;

43 Code Manager (i) public class Manager { private Servant ref ; public Manager (Servant s) throws Exception { this.ref = s ; public void process (Socket sock) throws Exception { BufferedReader in =... DataOutputStream out =... while (true) { String msg = in.readline () ; if (msg == null) // no more to be read break ; String res ; switch (msg.charat (0)) {

44 Code Manager (i) case 0 : res = this.ref.hello (msg.substring (1)) + "\n" ; break ; case 1 : res = this.ref.lower (msg.substring (1)) + "\n" ; break ; case 2 : res = this.ref.upper (msg.substring (1)) + "\n" ; break ; default: res = "Unknown operation requested" ; out.writebytes (res) ;

45 Bénéfices et limitations Bénéfices Découplage complet entre code technique et code métier (côté serveur) Les services sont implantés comme des objets (Servant) Limitations L interface du service n est pas connue comme telle du client Le code client n est toujours pas objet

46 5. Passage à l objet du côté client

47 Principe Côté serveur Définition d un contrat à partager avec le client Le servant implémente le contrat commun Côté client Utilisation d un objet représentant le service : Proxy Même interface que le service Encapsule le code technique de gestion du réseau

48 Architecture version 5 Client Servant Proxy Contrat Manager Réseau

49 Interactions version 5 Client Proxy Server Manager Servant create () create (servant) init () connect () process (sock) hello (str) send (message) hello (str) send (message) return

50 Côté serveur Modifications Définition d un contrat de service Le servant implémente le contrat de service Contrat de service Définit toutes les méthodes accessibles à distance Chaque méthode peut lever une exception liée au réseau

51 Contrat de service package step5 ; interface Service { public String hello (String msg) throws Exception ; public String lower (String msg) throws Exception ; public String upper (String msg) throws Exception ;

52 Modification du Servant public class Servant implements Service { public String hello (String msg) throws Exception { return "hello, " + msg ; public String lower (String msg) throws Exception { return msg.tolowercase () ; public String upper (String msg) throws Exception { return msg.touppercase () ;

53 Côté client Programme client Instancie un proxy Invocation des méthodes du proxy Mise en œuvre du Proxy Implémente l interface de contrat Initialise la connexion au serveur Gère toute la partie échanges réseaux

54 Code du Client public class Client { private Service ref ; public Client () throws Exception { this.ref = (Service) new Proxy () ; public void run (String msg) throws Exception { System.out.println (this.ref.hello (msg)) ; System.out.println (this.ref.lower (msg)) ; System.out.println (this.ref.upper (msg)) ; // unchanged

55 Code du Proxy (i) public class Proxy implements Service { private Socket sock ; private BufferedReader in ; private DataOutputStream out ; public Proxy () throws Exception { this.sock = new Socket ("localhost", 12345) ; this.in =... this.out =... public String hello (String msg) throws Exception { this.out.writebytes ("0" + msg + "\n") ; String res = this.in.readline () ; return res ;

56 Code du Proxy (ii) public String lower (String msg) throws Exception { this.out.writebytes ("1" + msg + "\n") ; String res = this.in.readline () ; return res ; public String upper (String msg) throws Exception { this.out.writebytes ("2" + msg + "\n") ; String res = this.in.readline () ; return res ; protected void finalize () throws Throwable { this.sock.close () ;

57 Bénéfices et limitations Bénéfices Du point de vue du client la répartition est masquée Le service est vu et manipulé comme un objet local Limitations Comment utiliser des paramètres autres que de type String Comment désigner un service distant (sans le coder en dur)

58 6. Encodage et décodage des données

59 Principe Traduction des paramètres Empaquetage : application vers les messages réseau type de base vers représentation chaîne Dépaquetage : messages réseau vers application représentation chaîne vers type de base Opérations de traduction symétriques Serveur : dépaquetage des paramètres, empaquetages des valeurs de retour Client : empaquetage des paramètres, dépaquetages des valeurs de retour

60 Architecture version 6 Client Servant Proxy Contrat Manager Réseau

61 Interactions version 6 Client Proxy Server Manager Servant create () create (servant) init () connect () process (sock) sqr (val) marshal () send (message) unmarshall () sqr (val) send (message) marshall () return unmarshall ()

62 Côté serveur Modification du contrat de service Offre une opération supplémentaire Calcul du carré d un entier (retourne un entier) Modification de la mise en œuvre Manager : message réseau supplémentaire et décodage entier Servant : implémentation de la nouvelle méthode

63 Contrat Service interface Service { public String hello (String msg) throws Exception ; public String lower (String msg) throws Exception ; public String upper (String msg) throws Exception ; public int sqr (int a) throws Exception ;

64 Code Manager public void process (Socket sock) throws Exception { // unchanged switch (msg.charat (0)) { // unchanged for 0-2 case 3 : int val = Integer.parseInt (msg.substring (1)) ; res = "" + this.ref.sqr (val) + "\n" ; break ; default: res = "Unknown operation requested" ; out.writebytes (res) ;

65 Code Servant public class Servant implements Service { // unchanged public int sqr (int val) throws Exception { return val * val ;

66 Côté client Modification de la mise en œuvre Le proxy implémente la nouvelle opération Le programme client utilise la nouvelle opération Mise en œuvre du Proxy Empaquetage de l entier paramètre dans une chaîne Dépaquetage de l entier contenu dans la chaîne retour

67 Code Proxy public class Proxy implements Service { // unchanged public int sqr (int val) throws Exception { this.out.writebytes ("3" + val + "\n") ; String res = this.in.readline () ; return Integer.parseInt (res) ;

68 Code Client public class Client { // unchanged public void run (String msg) throws Exception { System.out.println (this.ref.hello (msg)) ; System.out.println (this.ref.lower (msg)) ; System.out.println (this.ref.upper (msg)) ; int res = this.ref.sqr (123) ; System.out.println (res) ;

69 Bénéfices et limitations Bénéfices Utilisation transparente des types de base autres que String Vision objet d une application répartie Limitations Comment désigner un service distant sans le coder en dur Comment écrire un client pouvant utiliser plusieurs services

70 7. Notion de référence distante

71 Principe Désignation d un service distant Equivalent à une référence Java mais en réparti Permet d établir une connexion avec un service Définition d une référence (base) Hôte distant : adresse IP Serveur distant : port IP

72 Architecture version 7 Client Servant Proxy Contrat Manager Réseau

73 Interactions version 7 Client Proxy Server Manager Servant create () create (servant) init () connect () process (sock) hello (str) marshal () send (message) unmarshall () hello (str) send (message) marshall () return unmarshall ()

74 Côté client Fourniture de la référence du serveur Propriété java contenant la référence Référence donnée sous la forme machine:port Ajout d un méthode de gestion des références Analyse la référence Instancie et initialise le Proxy d accès au service # utilisation avec une reference > java -Dservice.reference=localhost:12345 \ step7.client DrNo

75 Code Client public class Client { private Service ref ; public Client () throws Exception { this.ref = (Service) this.ref2proxy () ; // other methods unchanged

76 Code Client public Proxy ref2proxy () throws Exception { Properties props = System.getProperties () ; String ref = props.getproperty ("service.reference") ; if (ref == null) throw new Exception ("no server reference given") ; String parts[] = ref.split (":") ; if (parts.length < 2) throw new Exception ("malformed reference") ; String host = parts [0] ; int port = Integer.parseInt (parts [1]) ; return new Proxy (host, port) ;

77 Bénéfices et limitations Bénéfices Le code client n est pas lié à une instance de serveur Possibilité d utiliser différents serveurs Limitations Un seul objet service par serveur Un client ne peut utiliser qu un objet à la fois Le client doit connaître le type de la référence à la compilation

78 8. Notion d adaptateur d objet

79 Principe Rendre plusieurs objets (Servant) disponibles dans un serveur Chaque objet est associé à une clé unique dans le serveur Un référence inclut désormais la clé de l objet Adaptateur d objet Aiguillage et lien entre le réseau et les objets Gère les clés associées aux objets et leurs références Raffinement du Manager Adaptateur : lien référence / objet d implémentation Squelette : décodeur de requête pour un objet

80 Architecture version 8 Client Servant Servant Proxy Contrat Skeleton Skeleton ObjectAdapter Réseau

81 Interactions version 8 Client Proxy Server Object Adapter Skeleton Servant init () create () create (servant) register (skel) init () connect () process () run (sock) hello (str) marshal () send (message) unmarshall () hello (str) send (message) marshall () return unmarshall ()

82 Côté serveur Adaptateur d objet Gestion du accept et du routage des requêtes Connecte les objets et crée leurs références Squelette de service Défini par rapport au contrat de Servant Décodeur de messages réseau pour un Servant particulier Définition de deux squelettes Programme serveur Crée un adaptateur d objet Crée deux squelettes et servants, les enregistre Active l adaptateur d objet

83 Contrats interface ServiceA { public String hello (String msg) throws Exception ; public String lower (String msg) throws Exception ; public String upper (String msg) throws Exception ; interface ServiceB { public boolean isprime (int a) throws Exception ; public int sqr (int a) throws Exception ;

84 Code Server public class Server { public void run () throws Exception { ObjectAdapter oa = ObjectAdapter.init () ; SkeletonA skel_a = new SkeletonA (new ServantA ()) ; oa.register (skel_a) ; System.out.println (oa.obj2ref (skel_a)) ; SkeletonB skel_b = new SkeletonB (new ServantB ()) ; oa.register (skel_b) ; System.out.println (oa.obj2ref (skel_b)) ; oa.start () ; // rest is unchanged

85 Code ObjectAdapter (i) public class ObjectAdapter extends Thread { private static ObjectAdapter ref ; private ServerSocket asock ; private Vector skeletons ; protected ObjectAdapter () throws Exception { this.skeletons = new Vector () ; this.asock = new ServerSocket (0) ; public static ObjectAdapter init () throws Exception { if (ObjectAdapter.ref == null) ObjectAdapter.ref = new ObjectAdapter () ; return ObjectAdapter.ref ;

86 Code ObjectAdapter (ii) public String obj2ref (Skeleton obj) { int key = this.skeletons.indexof (obj) ; if (key == -1) return null ; String host = null ; try { host = InetAddress.getLocalHost ().gethostaddress () ; catch (UnknownHostException uhe) { return null ; int port = this.asock.getlocalport () ; return host + ":" + port + ":" + key ;

87 Code ObjectAdapter (iii) public void run () { try { while (true) { Socket sock = this.asock.accept () ; BufferedReader in =... String msg = in.readline () ; if (msg == null) { // no more to be read sock.close () ; continue ; int key = Integer.parseInt (msg.substring (0,1)) ;

88 Code ObjectAdapter (iv) try { Skeleton skel = (Skeleton)this.skeletons.elementAt (key) ; skel.init (sock) ; new Thread (skel).start () ; catch (ArrayIndexOutOfBoundsException e) { sock.close () ; catch (Exception e) { return ;

89 Interface Skeleton interface Skeleton extends Runnable { void init (Socket sock) throws Exception ;

90 Code SkeletonA (i) public class SkeletonA implements Skeleton { private ServantA ref ; public SkeletonA (ServantA s) throws Exception { this.ref = s ; public void init (Socket sock) throws Exception { this.in =... this.out =...

91 Code SkeletonA (ii) public void run () { try { while (true) { String msg = this.in.readline () ; if (msg == null) // no more to be read break ; String res ; switch (msg.charat (0)) { case 0 : res = this.ref.hello (msg.substring (1)) + "\n" ; break ; // etc.

92 Côté client Modification du proxy Prise en compte des clés d objets Connexion en deux temps au squelette Définition d un Proxy pour chacun des services Deux chaînes Proxy / Skeleton / Servant Fourniture de la référence comme une propriété Définition de deux programes clients Chacun utilise un proxy pour un service particulier

93 Code ProxyA (changes) public class ProxyA implements ServiceA { private Socket sock ; private BufferedReader in ; private DataOutputStream out ; public ProxyA (String host, int port, String key) throws Exception { this.sock = new Socket (host, port) ; this.in =... this.out =... this.out.writebytes (key + "\n") ;

94 Code ClientA (changes i) public class ClientA { private ServiceA ref ; public ClientA () throws Exception { this.ref = (ServiceA) this.ref2proxy () ; public void run (String msg) throws Exception { System.out.println (this.ref.hello (msg)) ; System.out.println (this.ref.lower (msg)) ; System.out.println (this.ref.upper (msg)) ;

95 Code ClientA (changes ii) public ProxyA ref2proxy () throws Exception { Properties props = System.getProperties () ; String ref = props.getproperty ("service.reference") ; if (ref == null) throw new Exception ("no server reference given") ; String parts[] = ref.split (":") ; if (parts.length < 3) throw new Exception ("malformed reference") ; String host = parts [0] ; int port = Integer.parseInt (parts [1]) ; String key = parts [2] ; return new ProxyA (host, port, key) ;

96 Bénéfices et limitations Bénéfices Serveur multi-services et multi-threadé (Skeleton) Identification complète d un service adresse:port:cle Les références sont créées au niveau du serveur Limitations Comment définir et utiliser des exceptions applicatives? Comment simplifier la traduction de référence en Proxy

97 9. Exceptions et traduction référence vers Proxy

98 Principe Exceptions Ajout d un code dans les messages de retour 0 : OK ; sinon un numéro d exception... Traduction automatique de références en Proxy Extension des références pour contenir le type des références Contrôle du typage lors de la création du proxy Instanciation et initialisation automatique du Proxy

99 Architecture version 9 Client Servant Servant Proxy Contrat Skeleton Skeleton ObjectAdapter Réseau

100 Interactions version 9 Client Proxy Server Object Adapter Skeleton Servant init () create () create (servant) register (skel) init () connect () process () run (sock) hello (str) marshal () send (message) unmarshall () hello (str) send (message) marshall () return unmarshall ()

101 Chargement automatique de proxy Motivations Transformation d une référence de service distant en proxy Contrôler la conformité entre le type du proxy et du service Modifications des implémentations Extension des références Ajout du type du service dans la référence : adresse:port:cle:type Règles de nommage des classes NomDuServiceProxy, NomDuServiceSkeleton, NomDuServiceServant Les squelettes fournissent le type du service (pour construire la référence) Interface de base Proxy implémentée par tous les proxy (pour init)

102 Opération ref2proxy (i) public class Util { public static Proxy ref2proxy (String ref) throws Exception { String parts[] = ref.split (":") ; if (parts.length < 4) throw new Exception ("malformed reference") ; String host = parts [0] ; int port = Integer.parseInt (parts [1]) ; String key = parts [2] ; String type = parts [3] ;

103 Opération ref2proxy (ii) // instanciation du bon proxy (present dans classpath) Class pclass = Class.forName (type + "Proxy") ; Proxy p = (Proxy) pclass.newinstance () ; // initialisation p.init (host, port, key) ; return p ;

104 Côté serveur Gestion des exceptions Définition des exceptions dans le contrat du service Modification des squelettes pour transférer les exceptions Ajout de try catch pour les exceptions applicatives Ajout d un code en début de message réponse réseau Typage des références Modification des squelettes : fourniture du type du servant Modification de l opération obj2ref dans l adapteur d objet

105 Contrat ServiceB public class DivByZero extends Exception { interface ServiceB { public boolean isprime (int a) throws Exception ; public int sqr (int a) throws Exception ; public int div (int a, int b) throws Exception, DivByZero ;

106 Interface Skeleton interface Skeleton extends Runnable { void init (Socket sock) throws Exception ; String type () ;

107 Code ServiceBSkeleton (changes i) public String type () { return "step9.serviceb" ; public void run () { // unchanged // managing isprime method from ServiceB case 0 : int val0 = Integer.parseInt (msg.substring (1)) ; res = "0" + this.ref.isprime (val0) + "\n" ; break ;

108 Code ServiceBSkeleton (changes ii) // managing div method from ServiceB case 2 : String args [] = msg.substring (1).split (" ") ; int arg0 = Integer.parseInt (args [0]) ; int arg1 = Integer.parseInt (args [1]) ; try { res = "0" + this.ref.div (arg0,arg1) + "\n" ; catch (DivByZero e) { res = "1\n" ; // first exception raised break ; // etc.

109 Code ObjectAdapter public String obj2ref (Skeleton obj) { int key = this.skeletons.indexof (obj) ; if (key == -1) return null ; String host = null ; try { host = InetAddress.getLocalHost ().gethostaddress () ; catch (UnknownHostException uhe) { return null ; int port = this.asock.getlocalport () ; return host + ":" + port + ":" + key + ":" + obj.type () ;

110 Côté client Modification des proxy Gestion des exceptions Si code interne supérieur à 0 alors lever l exception équivalente Modification des clients Utilisation de l opération ref2proxy Plus besoins préciser le nom du Proxy Utiliser le proxy avec le type de son interface

111 Code ServiceBProxy (changes i) public boolean isprime (int val) throws Exception { // automatic conversion of int to string out.writebytes ("0" + val + "\n") ; String res = in.readline () ; return Boolean.valueOf (res.substring (1)).booleanValue () ;

112 Code ServiceBProxy (changes ii) public int div (int a, int b) throws Exception, DivByZero { out.writebytes ("2" + a + " " + b + "\n") ; String res = in.readline () ; if (res.charat (0) == 1 ) throw new DivByZero () ; return Integer.parseInt (res.substring (1)) ;

113 Code ClientB (changes) public ClientB () throws Exception { Properties props = System.getProperties () ; String ref = props.getproperty ("service.reference") ; this.refb = (ServiceB) Util.ref2proxy (ref) ;

114 Bénéfices et limitations Bénéfices Bénéfices des exceptions sur le code produit Contrôle du typage à l utilisation des références Limitations Partage des références compliqué et réduit au fichier Utiliser facilement plusieurs services dans un même client?

115 10. Service de désignation

116 Principe Désignation des objets par des noms symboliques Association : nom symbolique / références Les serveurs enregistrent une référence avec un nom Les clients recherchent une référence avec un nom Service notoire : l annuaire

117 Architecture version 10 Client Naming Servant Service Servant Proxy Contrats Skeleton OAdapt Skeleton OAdapt Réseau

118 Interactions version 10 (*) Client Naming Proxy Service Proxy NameServer Naming Proxy Server Service connect () init () send (message) bind (ref) create () init () connect () lookup () send (message) ref2proxy () connect () hello (str) return send (message) send (message)

119 Annuaire Service au même titre qu un autre Défini par une interface Hébergé par un serveur Accessible au travers d un Proxy Particularités Serveur dédié initialisé sur un port prédéfini Connaître la machine = point d entrée du système Proxy particulier pour simplifier l utilisation Patron de conception Singleton

120 Contrat NameService interface NameService { public void export (String name, String ref) throws Exception ; public String lookup (String name) throws Exception ;

121 Proxy Naming (extrait) public class Naming { private static Naming ref ; private Naming () throws Exception { Properties props = System.getProperties () ; String host = props.getproperty ("naming.host") ; // etc. public static Naming init () throws Exception { if (Naming.ref == null) Naming.ref = new Naming () ; return Naming.ref ; // etc. // etc.

122 Côté serveur Diffusion des références Plus d affichage sur la ligne de commande Export des références de services Vers une application répartie Le serveur est client du service de nommage Utilisation du proxy de ce dernier Unique point d entrée : référence du service de nommage $ java -Dnaming.host=localhost step9.server

123 Code Server (changes) public void run () throws Exception { Naming ns = Naming.init () ; ObjectAdapter oa = ObjectAdapter.init () ; ServiceASkeleton skel_a = new ServiceASkeleton (new ServiceAServant ()) ; oa.register (skel_a) ; ns.export ("ServiceA", oa.obj2ref (skel_a)) ; ServiceBSkeleton skel_b = new ServiceBSkeleton (new ServiceBServant ()) ; oa.register (skel_b) ; ns.export ("ServiceB", oa.obj2ref (skel_b)) ; oa.run () ;