|
|
|
Cas Alarme - ConceptsA/ Principes de fonctionnement1. Application distribuéeNous allons écrire une application très simple qui permettra d'illustrer le concept d'application distribuée. L'application permet à l'utilisateur de saisir un entier, le mémorise, est capable de le restituer... pas grand chose en fait ! Son originalité tient au fait que le travail de l'application sera partagé entre deux programmes :
Le programme gereVal est client de memoVal en ce sens qu'il utilise ses capacités de mémorisation d'une valeur. Le schéma ci dessous illustre le fonctionnement de l'ensemble :
Lorsque l'utilisateur souhaite conserver une valeur (la retenue d'une opération en cours par exemple), il la communique au programme gereVal (étape 1). Celui-ci fait alors appel au programme memoVal pour la mémorisation de cette valeur (étape 2). Lorsque l'utilisateur souhaite retrouver cette valeur, le programme gereVal demande à memoVal de lui restituer la valeur mémorisée (étape 3), puis l'affiche à l'utilisateur (étape 4). Remarques :
2. Quelques notions sur DCOMLa technologie utilisée est assez complexe, mais il suffit en fait d'en comprendre les grands principes pour pouvoir la mettre en ouvre à l'aide d'un outil de développement. a. Qu'est-ce-qu'un serveur et un client ?Un serveur DCOM est un programme capable de permettre à d'autres programmes (ses clients) d'utiliser certains de ses objets (au sens poo). Cette possibilité se résume à deux choses essentielles :
b. Notion d'interfaceEn programmation objet, on appelle l'interface d'une classe l'ensemble des méthodes (et éventuellement des propriétés) déclarées publiques, donc visible depuis l'extérieur. Chaque classe possède une interface et un ensemble de propriétés et de méthodes privées lui permettant de réaliser effectivement les fonctionnalités de son interface (on parle d'implémentation de la classe). Avec DCOM, les notions d'interface et d'implémentation ont la même signification, mais ces deux éléments sont réellement distincts. On peut résumer la situation ainsi : Programmation objet "classique" :
Technologie DCOM :
Intérêts de cette architecture :
c. Types d'application serveurIl existe trois types d'applications serveur :
d. Appel de procédure distantAu niveau de l'application cliente, on ne connaît que l'interface. On déclare donc une variable du type de l'interface, et on obtient ainsi un accès à la création dynamique d'un objet sur le serveur. Une fois l'objet créé sur le serveur, on peut appeler l'une de ses méthodes, toujours via l'interface. Lorsque le serveur est un serveur distant, le mécanisme mis en ouvre est appelé RPC (Remote Procedure Call).
Ce mécanisme s'appelle le "marshaling". e. Caractéristiques d'une classe DCOMType d'instanciation
Modèle de Thread Puisque plusieurs programmes clients peuvent accéder à l'application serveur, il faut faire attention aux conflits d'accès. Le modèle de Thread détermine ce qui est protégé et sécurisé automatiquement par DCOM.
B/ Présentation algorithmique de l'applicationL'application serveurPrincipe de l'application "MemoVal" Notre application serveur doit définir une interface DCOM (interface ImemInt) prévoyant les services utilisables par les clients et une classe DCOM (classe CoMemInt) implémentant ces services. Cette architecture peut se représenter de la manière suivante :
> IMemInt L'interface "ImemInt" doit fournir les services suivants :
Il est donc possible de la décrire par : Interface IMemInt procédure setValeur(entier val) // permet de mémoriser une valeur entière. procédure getValeur(variable entier val) // restitue la valeur mémorisée. procédure showValeur // affiche la valeur mémorisée sur la machine serveur Fin interface > CoMemInt La classe CoMemInt doit implémenter l'interface ImemInt, c'est-à-dire réaliser de manière concrète l'ensemble des services prévus. Il convient donc de choisir une implémentation de ces services. Ici, ce choix est assez simple : nous allons utiliser une donnée privée de type entier pour mémoriser la valeur fournie par l'application cliente. Voici la description de la classe "CoMemInt" : Classe CoMemInt (implémente ImemInt) valeur : entier procédure setValeur(entier val) début valeur ß val fin procédure getValeur(variable entier val) début val ß valeur fin procédure showValeur début afficher(valeur) fin Fin Classe Remarques :
L'application clientePrincipe général L'application "gèreVal" doit :
Interface utilisateur L'écran ci-dessous résume les possibilités offertes à l'utilisateur :
Réalisation // déclaration de la variable ImemInt et création de l'objet distant valeurMemo : IMemInt; valeurMemo ß CoMemInt.CreateRemote('192.168.210.2') Remarque : cette méthode est obligatoirement implémentée par toute classe DCOM. Elle permet la création d'un objet distant sur la machine dont l'adresse IP est passée en paramètre. // Mémorisation d'une valeur afficher("Valeur à mémoriser : ") saisir(i) valeurMemo.setValeur(i); // Restitution de la valeur valeurMemo.getValeur(i); afficher(i) // Demande d'affichage par l'application serveur valeurMemo.showValeur; C/ Réalisation à l'aide de Delphi1. Création de l'application serveurCréez deux répertoires : un pour le serveur, un autre pour le client. Lancez Delphi, créez une nouvelle application et enregistrez-la dans le répertoire serveur (ficheMemoVal.pas, memoVal.dpr). Créez un nouvel objet automation (page ActiveX) :
Remarque : sous Delphi, une classe DCOM est appelée une CoClasse. La fenêtre d'édition de la bibliothèque de type s'ouvre. Fermez-la et enregistrez l'unité dans le répertoire serveur sous le nom memInt.pas (fichier... enregistrer sous). 2. Définition de l'interface supportée par la CoClasse "CoMemInt"Choisissez "langage pascal" (et non IDL) dans les options d'environnement (onglet bibliothèque de types). Delphi a généré une interface IMemInt (vide pour le moment) comme interface par défaut pour notre CoClasse CoMemInt. Choisissez l'option "bibliothèque de type" du menu "voir" afin de compléter cette interface. Ajoutez trois méthodes à l'interface IMemInt :
3. Définition des méthodes de la CoClasseL'outil de définition d'interface COM a généré le squelette de la CoClasse et des méthodes destinées à implémenter l'interface ImemInt (fichier memInt.pas). Il vous suffit de compléter la classe Delphi TMemInt qui correspond à la CoClasse CoMemInt :
4. Recensement et configuration du serveurPour pouvoir être utilisé, le serveur doit être recensé dans le système. Il suffit pour cela d'exécuter l'application. Vous pouvez ensuite vérifier le recensement de la CoClasse memInt à l'aide du programme "dcomcnfg.exe". Remarque : il est possible de recenser ou d'annuler le recensement du serveur en utilisant le programme "tregsvr.exe" fourni avec Delphi. Le programme "dcomcnfg.exe" permet également de configurer les accès au serveur d'objets com :
5. Création de l'application clienteChoisissez "tout fermer" dans le menu fichier et créez une nouvelle application. Enregistrez ce projet dans le répertoire client (ficheGereVal.pas, gereVal.dpr). 6. Intégration du composant serveurPour que l'application cliente puisse utiliser le composant serveur, il faut qu'elle soit informée de son existence et qu'elle possède les informations concernant son (ou ses) interface(s). Il vous suffit pour cela d'ajouter le fichier memoVal_TLB.pas dans la clause uses de la fiche principale "ficheGereVal" (ce fichier a été généré lors de la construction du serveur). Remarque : Delphi offre également une autre solution : importer la bibliothèque de types définies à l'étape précédente par l'intermédiaire du menu projet. Cette importation est inutile dans notre cas, mais il est intéressant de connaître cette possibilité. Cette importation peut :
7. Utilisation de la CoClasseL'unité memoval_TLB intégrée au projet, il ne reste plus qu'à utiliser l'interface et la CoClasse pour gérer un objet MemInt.
Il s'agit d'une interface, le type MemInt est équivalent à ImemInt (équivalence déclarée dans MemoVal_TLB.pas)
Voici le code associé à chacun de ces boutons : procedure Tfm_gereVal.bt_creerClick(Sender: TObject); begin valeurMemo:=CoMemInt.CreateRemote('192.168.210.2'); end;
procedure Tfm_gereVal.bt_memoriserClick(Sender: TObject); var i:integer; begin i:=StrToInt(InputBox('Mémorisation','Valeur entière :','')); valeurMemo.setValeur(i); end;
procedure Tfm_gereVal.bt_restituerClick(Sender: TObject); var i:integer; begin valeurMemo.getValeur(i); ShowMessage(IntToStr(i)); end;
procedure Tfm_gereVal.bt_afficherClick(Sender: TObject); begin valeurMemo.showValeur; end;
Voici le formulaire de l'application gereVal :
- Construisez le projet. D/ Déploiement de l'application1. RecensementChacune des deux applications nécessite un recensement sur la machine d'exécution. Pour l'application serveur, ce recensement est fait à l'aide de tregsvr.exe ou simplement en lançant le programme memoVal.exe. Le recensement peut être annulé à l'aide de "tregsvr -u memoVal.exe". Pour l'application cliente, le recensement ne concerne que la bibliothèque de types. Il peut être fait automatiquement sur la machine de développement en cas d'importation de cette bibliothèque, ou manuellement par "tregsvr -t memoVal.tlb" en cas de simple clause "uses" (c'est notre cas), ou encore en cas de déploiement sur une autre machine. Le recensement peut être annulé par "tregsvr -u memoVal.tlb". Remarque : si l'application serveur doit être déployée sur une autre machine du réseau, son exécution suffira à la recenser. Il faudra par contre modifier l'adresse IP ou le nom de machine mentionné dans l'application cliente. 2. Observation du fonctionnement
Vous pouvez également observer le fonctionnement de l'application memoVal à l'aide du debogueur. Pour cela :
Remarque : avec deux postes, vous pouvez même déboguer les deux applications en même temps. |
|||||||||||||||||||||||||||||||||||
|
_____________________________________________
|