Netzprogrammierung: Microsoft.NET Remoting Robert Tolksdorf und Peter Löhr
Überblick 1. Fernaufrufbare Objekte 2. Parameterübergabe 3. Konfigurationsdateien http://msdn.microsoft.com/en-us/library/72x4h507(vs.85).aspx (.NET Framework 3.0) Robert Tolksdorf und Peter Löhr 2
Fernaufrufbare Objekte Robert Tolksdorf und Peter Löhr
.NET.NET ( dotnet ) : von Microsoft eingeführte Plattform für verteilte Anwendungen: virtuelle Maschine CLR (common language runtime) für die verteilte Ausführung von Programmen, deren Klassen in unterschiedlichen Sprachen geschrieben sein können C#, C++, J#, Visual Basic, Eiffel, Jscript,... C# (dt. Cis, engl. C-sharp ) : Referenzsprache für.net, Microsoft s Antwort auf Java.NET Remoting : Fernaufrufe auf der.net-plattform Robert Tolksdorf und Peter Löhr 4
.NET Remoting Fernaufrufbarkeit wird nicht an Schnittstellen, sondern an Klassen festgemacht: eine Klasse für fernaufrufbare Objekte wird als Unterklasse der Bibliotheksklasse System.MarshalByRefObject vereinbart, z.b. class TextStore : MarshalByRefObject {... } statt interface Text extends Remote {... } wie in Java. Methoden von MarshalByRefObject : geerbte Methoden von Object (Equals, tostring,...) CreateObjectRef liefert ObjectRef-Objekt, das Informationen für die explizite Herstellung eines Objektvertreters (proxy) enthält... Robert Tolksdorf und Peter Löhr 5
Objekterzeugung in 3 Varianten... für fernaufrufbare Objekte auf einem Rechner R: Fernerzeugung eines privaten Objekts: Objekt wird mit new erzeugt, aber auf anderem Rechner R; der Erzeuger erhält einen Fernverweis. Fernerzeugung eines öffentlichen Objekts: Erzeugung wird auf R lokal vorbereitet, aber erst beim ersten Zugriff eines Klienten durchgeführt. Bekanntmachung eines öffentlichen Objekts: Objekt wird auf R erzeugt und dann veröffentlicht. (Dies entspricht der Erzeugung bei Java RMI.) Robert Tolksdorf und Peter Löhr 6
Fernerzeugung eines privaten Objekts Terminologie: client-activated object (CAO) Der Anbieter vereinbart einen Port, über den er erreichbar ist, und registriert eine Klasse wie z.b. TextStore beim lokalen Fernaufrufsystem. Der Klient stellt unter Angabe der gewünschten Klasse TextStore über sein lokales Fernaufrufsystem die Verbindung zum Anbieter her und kann mit new TextStore ein Objekt fernerzeugen. Robert Tolksdorf und Peter Löhr 7
Anbieter registriert Klasse using System; // import library name spaces using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class TextStore : MarshalByRefObject { string text; public TextStore(string init) { text = init; } public void replace(string s) { text = s; return; } public string remove() { string result = text; text = null; return result; } public static void Main() { ChannelServices.RegisterChannel(new TcpServerChannel(4711)); RemotingConfiguration.RegisterActivatedServiceType( typeof(textstore)); Console.WriteLine("press ENTER to stop server."); Console.ReadLine(); } } Robert Tolksdorf und Peter Löhr 8
Fernerzeugung durch Klienten using System; using System.Runtime.Remoting; public class Test { public static void Main() { RemotingConfiguration.RegisterActivatedClientType( typeof(textstore), "tcp://localhost:4711"); TextStore text = new TextStore("initial text"); Console.WriteLine(text.remove()); // writes "initial text Console.WriteLine("press ENTER for another try:"); Console.ReadLine(); Console.WriteLine(text.remove()); // raises exception } } Beachte: Hier besteht kein Bedarf für ein rmiregistry. Robert Tolksdorf und Peter Löhr 9
Übersetzen und Testen (lokal) Übersetzen: C:\> csc server.cs C:\> csc /t:library server.cs C:\> csc /r:server.dll client.cs Programm server erzeugen Klasse server.dll bereitstellen (Windows dynamic link library,.net assembly) Programm client erzeugen Testen:... und dann: C:\> client initial text press ENTER for another try: in separatem Fenster: C:\> server press ENTER to stop server.... ohne Aufsetzen eines Registry! Robert Tolksdorf und Peter Löhr 10
Öffentliches Objekt bekanntmachen Bereitstellung eines fernaufrufbaren Objekts - ebenfalls ohne Aufsetzen eines Registry: Port registrieren: TcpChannel channel = new TcpServerChannel(4711); ChannelServices.RegisterChannel(channel); Objekt erzeugen: Server server = new Server(); Objekt mit mnemonischem Namen registrieren: RemotingServices.Marshal(server, "ServerObject"); Nachdem dies auf dem Rechner host ausgeführt wurde, beschaffen Klienten sich einen Fernverweis wie folgt: Server s = (Server)Activator.GetObject( typeof(server), "tcp://host:4711/serverobject"); Robert Tolksdorf und Peter Löhr 11
Schnittstellen verwenden! C:\> csc /r:server.dll client.cs Programm client erzeugen (von S. 10) mit Bezugnahme auf den Anbieter-Code ist nur für einfache lokale Tests praktikabel. Falls Implementierung des Dienstes (Klasse Server) nicht beim Klienten bekannt, Schnittstelle verwenden: public interface Service {... } public class Server : Service, MarshalByRefObject { public static void Main(string[] arg) {... }... public class Client {...... Service s = (Service )Activator.GetObject( typeof(service), "tcp://taos:4711/serverobject");... Robert Tolksdorf und Peter Löhr 12
Parameterübergabe Robert Tolksdorf und Peter Löhr
Parametermechanismen in C# op(int i) Wertparameter (call-by-value) Bei Fernaufrufen: call-by-value op(ref int i) op(out int i) Variablenparameter (call-by-reference) Bei Fernaufrufen: call-by-value-result! Variablenparameter, evtl. nicht belegt Bei Fernaufrufen: call-by-result! Beim Aufruf auch ref bzw. out, z.b. op(ref n) --> Bei ref drohen Verletzungen der Verteilungsabstraktion! Robert Tolksdorf und Peter Löhr 14
Variablenparameter Beispiel für abweichende Sematik: public void inc(bool cond, ref int x, ref int y) { if(cond) x++; else y++; }? Effekt von ob.inc(cond, ref a[i], ref a[k]);? Jedenfalls sollte ein Element des Feldes a erhöht sein (auch im Fall i==k).! Bei Fernaufruf kein Effekt falls cond && i==k! Robert Tolksdorf und Peter Löhr 15
Verweistypen Bei Verweistypen zusätzlich beachten (bei Argument- und Ergebnis-Objekten): Wenn Objekt fernaufrufbar (MarshalByRefObject): Fernverweis wird übergeben; sonst, wenn Objekt serialisierbar ( [Serializable] *): Objektkopie wird übergeben; sonst: Ausnahmemeldung. --> Verletzungen der Verteilungsabstraktion drohen! (vgl. Java RMI) * ein der Klassenvereinbarung vorangestelltes Attribut: [Serializable] class... Robert Tolksdorf und Peter Löhr 16
Verweistypen Wenn von einem Objekt nur eine Schnittstelle bekannt ist, kann sich dahinter ein MarshalByRefObject verbergen - oder auch nicht. Wenn ja, kann es tatsächlich in einem anderen Rechner liegen - oder auch nicht. (Vgl. Java RMI, Parametersemantik) Ohne genauere Typanalyse kann daher nicht entschieden werden, ob für einen zum/vom Objekt übertragenen Serializable Parameter ein Verweis oder eine Kopie übertragen wird. interface IStack {... } class Stack : IStack {... } class RemoteStack : IStack, MarshalByRefObject {... }... void op(istack stack) {... a = stack.dump();... } Robert Tolksdorf und Peter Löhr 17
Konfigurationsdateien Robert Tolksdorf und Peter Löhr
Auslagerung der netzspezifischen Daten wie Rechnernamen und Portnummern u.a. aus dem Programmtext in Konfigurationsdateien (XML) erlaubt deren Änderung ohne Neuübersetzung, flexibilisiert die Installation, verbessert die Verteilungsabstraktion. Robert Tolksdorf und Peter Löhr 19
Struktur Typische Struktur einer Konfigurationsdatei: <configuration> <system.runtime.remoting> <application> <channels>... </channels> <service>... </service> <client>... </client> </application> </system.runtime.remoting> </configuration> Robert Tolksdorf und Peter Löhr 20
Beispiel Fernerzeugung eines öffentlichen Objekts (SAO - server-activated object) Beim Anbieter wird Objekterzeugung vorbereitet: ChannelServices.RegisterChannel(new TcpServerChannel(4711)); RemotingConfiguration.RegisterWellKnownServiceType( typeof(server), "ServerObject", WellKnownObjectMode.Singleton); Klient beschafft sich Fernverweis (impliziert ggfls. Erzeugung): Server s = (Server)Activator.GetObject( // wie Klient auf s. 11 typeof(server), "tcp://host:4711/serverobject"); Robert Tolksdorf und Peter Löhr 21
Benutzung einer Konfigurationsdatei Im Anbieter wird ChannelServices.RegisterChannel(new TcpServerChannel(4711)); RemotingConfiguration.RegisterWellKnownServiceType( typeof(server), "ServerObject", WellKnownObjectMode.Singleton); ersetzt durch RemotingConfiguration.Configure("server.exe.config"); Name einer Konfigurationsdatei für das Programm (in Datei server.exe) Robert Tolksdorf und Peter Löhr 22
Konfigurationsdatei für den Anbieter Inhalt der Konfigurationsdatei server.exe.config : <configuration> <system.runtime.remoting> <application> <channels> <channel ref="tcp" port="4711"/> </channels> Klasse Assembly (server.dll) <service> <wellknown mode="singleton" type="server, server" objecturi="serverobject"/> </service> </application> </system.runtime.remoting> </configuration> Robert Tolksdorf und Peter Löhr 23
... und beim Klienten Im Klienten wird Server s = (Server)Activator.GetObject( // wie Klient auf s. 11 typeof(server), "tcp://host:4711/serverobject"); ersetzt durch RemotingConfiguration.Configure("client.exe.config"); Name einer Konfigurationsdatei für das Programm (in Datei client.exe) Robert Tolksdorf und Peter Löhr 24
Konfigurationsdatei für den Klienten Inhalt der Konfigurationsdatei client.exe.config : <configuration> <system.runtime.remoting> <application> <client> <wellknown type="server, client" url="tcp://host:4711/serverobject"/> </client> </application> </system.runtime.remoting> </configuration> Robert Tolksdorf und Peter Löhr 25
Zusammenfassung Robert Tolksdorf und Peter Löhr
Zusammenfassung Objekterzeugung - 3 verschiedene Techniken: Fernerzeugung eines privaten Objekts (CAO) Fernerzeugung eines öffentlichen Objekts (SAO) Bekanntmachung eines lokal erzeugten Objekts Kein separates Registry erforderlich stattdessen explizite Port-Angabe nötig Parameterübergabe: Abstraktionsschwächen Variablenparameter: Wert/Ergebnis-Übergabe Serializable: statt Verweis wird Objektkopie übergeben Konfigurationsdateien formuliert in XML entlasten den Programmcode ermöglichen Änderung der Konfigurationsdaten ohne Neuübersetzung (offen geblieben: Sicherheit, Leasing, HTTP,... ) Robert Tolksdorf und Peter Löhr 27
Literatur S. McLean:.NET Remoting. Microsoft Press 2002 I. Rammer: Advanced.NET Remoting. apress 2002 (2. ed. 2006) M. Kuhrmann, E. Horn, J. Calame: Verteilte Systeme mit.net Remoting. Spektrum 2004 http://msdn.microsoft.com/en-us/library/72x4h507(vs.85).aspx (.NET Framework 3.0) Robert Tolksdorf und Peter Löhr 28