Plan.NET remoting Clémentine Nebut LIRMM / Université de Montellier 2 de.net Remoting côté serveur côté client.net Remoting en ratique Les canaux de communication L'activation L'invocation Les aramètres Pour aller lus loin Conclusion Introduction Princie de.net remoting Communication client/serveur entre objets.net distants Proche de Java RMI Successeur de DCOM htt://msdn2.microsoft.com/fr fr/library/2e7z38xb(vs.80).asx Princie de.net remoting Au niveau des entités... Entités qui interagissent : Client Serveur Proxy (généré dynamiquement) L'interface de l'objet serveur artagée ar le client et le serveur 3 rogrammes : client.exe serveur.exe interface.dll Client Proxy Canal de communication Côté serveur Installation des objets serveurs Serveur
Au niveau des rogrammes... Côté serveur Client.exe Interface.dll Canal de communication Côté serveur Serveur.exe Interface.dll Définition de l'interface de l'objet distribué Définition de l'objet distribué hérite de MarshalByRefObject (ou est sérialisable) imlémente l'interface Définition du serveur création du canal de communication enregistrement du canal enregistrement du service Référence à l interface de l objet distribué Récuération d une référence d objet distant Puis utilisation de la référence.net remoting en ratique Les canaux de communication Activation d un objet distribué Tyes d invocations Le assage de aramètres Pour aller lus loin Durée de vie des objets ubliés Ramasse miettes Utilisation d un fichier de configuration Les canaux de communication 2 tyes de canaux «de base» TCP TcChannel format de message binaire transort ar socket HTTP HttChannel format de message SOAP (Simle Object Access Protocol) transort ar htt On eut créer de nouveaux canaux et/ou formats IIOP (ex. IIOP.NET htt://iio net.sourceforge.net) Les canaux de communication Définition du numéro de ort Enregistrement du canal de communication //numéro de ort int numort=8085; // on définit le canal de communication (ici : TCP) TcChannel canal=new TcChannel(numort); // on l'enregistre ChannelServices.RegisterChannel(canal, true); indique si le canal est sécurisé ou as, true valable our htt et TCP
Activation d un objet distribué Quand un objet est ublié côté serveur : son roxy est mis en lace quand un client fait un new() ou un Activator.getObject( ) MAIS il n est instancié que lors du remier ael de méthode Activation ar le serveur mode singleton = une seule instance de serveur artagée ar tous les clients mode singlecall = une instance ar ael de méthode Activation ar le client = une instance ar client Activation mode singleton Publication du service : RemotingConfiguration.RegisterWellKnownServiceTye( tyeof(maclasse), // le tye de l objet distribué "nomservice", // le nom que l on donne au service WellKnownObjectMode.Singleton);//le mode, ici : singleton Ael à l objet distribué : RemotingConfiguration.RegisterWellKnownClientTye( tyeof(maclasse),"tc://localhost:8085/nomservice"); MaClasse roxy = new MaClasse(); Si on a utilisé une interface (si MaClasse est une interface) : MaClasse roxy = (MaClasse)Activator.GetObject( tyeof(maclasse),"tc://localhost:8085/nomservice"); Activation mode singlecall Publication du service : RemotingConfiguration.RegisterWellKnownServiceTye( tyeof(maclasse), // le tye de l objet distribué "nomservice", // le nom que l on donne au service WellKnownObjectMode.Singlecall); //mode singlecall Ael à l objet distribué : RemotingConfiguration.RegisterWellKnownClientTye( tyeof(maclasse),"tc://localhost:8085/nomservice"); MaClasse roxy = new MaClasse(); Si on a utilisé une interface (si MaClasse est une interface) : MaClasse roxy = (MaClasse)Activator.GetObject( tyeof(maclasse),"tc://localhost:8085/nomservice"); Activation côté client L instance est créée dès le new du client Publication du service : RemotingConfiguration.RegisterActivatedServiceTye( tyeof(maclasse)); // le tye de l objet distribué Ael à l objet distribué : RemotingConfiguration.RegisterActivatedClientTye( tyeof(maclasse),"tc://localhost:8085"); MaClasse roxy = new MaClasse(); Si on a utilisé une interface : object[] url = new UrlAttribute("tc://localhost:8085 ")}; MaClasse roxy = (MaClasse)Activator.CreateInstance( tyeof(maclasse),null,url); Portée de la ublication.net Remoting exose les objets à d'autres domaines d'a. comme s'ils étaient locaux sauf : Membres statiques et méthodes rivées. Chams d'instance et accesseurs. Vérif au moment de l'exécution : si objet as un roxy, accès direct au cham ; sinon, le roxy fournit les accesseurs à l'aelant. Délégués. Marshalés ar valeur. L'objet au sein du délégué eut corresondre à n'imorte quel tye d'objet accessible à distance. Excetion : un délégué de méthode d'interface ne eut as être distant. Tyes d invocations Synchrone cas ar défaut Semi synchrone (ou asynchrone avec retour) une méthode our déclencher l ael : BeginInvoke une méthode our récuérer le résultat : EndInvoke utilisation de délégués Asynchrone (ou oneway) côté serveur : attribut [oneway] sur la méthode, as de tye de retour côté client : BeginInvoke suivi de EndInvoke
Invocation semi synchrone Exemle issu de la doc msdn une classe service un serveur un client qui utilise des aels semi synchrones Par valeur Par référence Le assage de aramètres Tyes de base : ar valeur Objets : ar valeur ou ar référence Passage de aramètre ar référence L objet transmis doit être d un tye héritant de MarshalByRefObject MarshalByRefObject :Client :Serveur Param :Param Passage de aramètre ar valeur L objet transmis doit être sérialisable soit imlémenter ISerializable soit attribut [Serializable] :Client :Param :Serveur :Param Param [Serializable] Pour aller lus loin... Durée de vie des objets ubliés Ramasse miettes Utilisation d un fichier de configuration Durée de vie des objets ubliés Si objet activé côté serveur en singlecall durée de vie as sécifiable car 1 nouvelle instance à chaque ael Les objets activés côté client et côté serveur en mode Singleton ossèdent un bail (lease) Par défaut : bail de 5 minutes, renouvelé de 2 minutes à chaque ael de méthode Possibilité de ersonnaliser le bail
Le bail Proriétés : InitLeaseTime durée de vie entre activation et 1er ael de méthode accès en lecture et en écriture RenewOnCallTime durée du renouvellement de bail accès en lecture et en écriture CurrentLeaseTime durée restante du bail accès en lecture seule Personnalisation des baux Possible AVANT l activation de l objet (i.e. quand lease.currentstate==leasestate.initial) En surchargeant la méthode InitializeLifetimeService de l objet ublié Si on veut une durée de vie illimitée, InitializeLifetimeService doit retourner null Le ramasse miettes Quand libérer la mémoire d un objet distribué, et donc otentiellement utilisé ar des clients? Utilisation des baux quand le bail d un objet exire : le gestionnaire de bail interroge les sonsors (clients) un sonsor qui ne réond as au bout d un certain tems (SonsorshiTimeout) est surimé s il n y a lus de sonsors, le bail exire effectivement, et l objet distribué est détruit Utilisation d un fichier de configuration Configuration de la connexion dans un fichier XML lutôt que dans le code RemotingConfiguration.Configure("Config.xml"); <configuration> <system.runtime.remoting> <alication> <service> <wellknown mode="singleton" tye="tyeobj, AssemblyName" objecturi= "URI" /> </service> <channels> <channel ref="tc" ort="8085" /> </channels> </alication> </system.runtime.remoting> </configuration>.net remoting et RMI Points communs distribution d'objets assage ar valeur et ar référence Différences ublication des objets Interface requise vs facultative... La gestion des roxies Rael : roxy = rerésentation locale d un objet distant En java Proxies générés avec l outil rmic ou dynamiquement En.NET Proxies générés dynamiquement avec un new Nécessité d avoir fourni des infos de localisation de l objet distant Nécessité d avoir déloyé chez le client la totalité de l imlémentation de l objet distribué Donc si on modifie le serveur, il faut modifier tous les clients Sauf si on a utilisé une interface
Le service de nommage En java : service de nommage résent Serveur de nom, enregistrement des associations noms logiques / localisation En.net : rien! Si le serveur change de nom ou dadresse, il faut changer tous les clients! Pourquoi? Raisons historiques : COM s auyait sur d autres systèmes our le nommage Microsoft refuse d imoser au client un service uniquement dédié au nommage La sécurité En java Intégrée au middleware de manière native En.NET Rien, de manière native Possible avec les serviced comonents, mais se base sur COM+ (cf cours sur les serviced comonents) System.EnterriseServices.SecurityCallContext Possible si utilisation d IIS IIS = Internet Information Server = serveur web roosé ar Microsoft, concurrent d Aache Les erformances Conclusion htt://www.dotnetguru.org/articles/comaratifs/benchj2eedotnet/j2eevsnetbench.html Pas de serveur de noms comme avec RMI «.NET en moyenne 2 à 3 fois + raide que J2EE!» Génération dynamique de roxy Mais as our rmi vs remoting Invocation asynchrone ou semi synchrone Guerre sur la erformance entre J2EE et.net Activation ar le client Références htt://www.labodotnet.com/desktomodules/labodotnet.articles/contentfiles/d f/remoting.df Cours Lionel Seinturier Cours Didier Donsez