Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

1 vs8.1.6 8.1.6.NET Remoting.Net („dotnet“) :von Microsoft eingeführte Plattform für verteilte Anwendungen, virtuelle Maschine für die verteilte Ausführung.

Ähnliche Präsentationen


Präsentation zum Thema: "1 vs8.1.6 8.1.6.NET Remoting.Net („dotnet“) :von Microsoft eingeführte Plattform für verteilte Anwendungen, virtuelle Maschine für die verteilte Ausführung."—  Präsentation transkript:

1 1 vs NET Remoting.Net („dotnet“) :von Microsoft eingeführte Plattform für verteilte Anwendungen, virtuelle Maschine für die verteilte Ausführung von Programmen in unterschiedlichen Sprachen C# („Csharp“) :Referenzsprache für.NET, Microsoft‘s Antwort auf Java.NET Remoting :Fernaufrufe auf der.NET-Plattform

2 2 vs Grundzüge der Fernaufruf-Programmierung in C# Klasse eines fernaufrufbaren Objekts muss erben von System.MarshalByRefObject z.B. using System; using System.Runtime.Remoting; class Server : MarshalByRefObject {private string memory = ""; public string echo(string s) { return memory += s; }

3 3 vs8.1.6 Objekterzeugung und –bekanntmachung in 3 Varianten:  Bekanntmachung eines öffentlichen Objekts: Objekt wird lokal erzeugt und dann „veröffentlicht“  Fernerzeugung eines öffentlichen Objekts: (bezeichnet als Server Activated Object, SAO) Erzeugung wird lokal vorbereitet, aber erst dann durchgeführt, wenn der erste Klient Interesse zeigt  Fernerzeugung eines privaten Objekts: (bezeichnet als Client Activated Object, CAO) Objekt wird auf anderem Rechner erzeugt, und der Erzeuger erhält einen Fernverweis darauf

4 4 vs8.1.6  Bekanntmachung eines öffentlichen Objekts mit Operation der Klasse System.Runtime.Remoting.RemotingServices : using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; TcpChannel channel = new TcpServerChannel(4711); ChannelServices.RegisterChannel(channel); Server server = new Server(); RemotingServices.Marshal(server, "Service"); bewirkt Registrierung bei eingebautem Namensdienst !

5 5 vs8.1.6 Nachdem dies auf dem Rechner obelix ausgeführt wurde, erhalten Klienten einen Fernverweis/Vertreterobjekt wie folgt: using System.Runtime.Remoting.Activation; Server s = (Server)Activator.GetObject( typeof(Server), "tcp://obelix:4711/Service"); Verweis auf Vertreter eines anonymen Typs, verträglich mit Server

6 6 vs8.1.6 Beachte:  Keine explizite Stub-Erzeugung  Stub Generator ist unsichtbar, erzeugt Stub Code bei Bedarf aus den Metadaten (Beschreibungen, Signaturen, Attribute u.a.) der beteiligten Klassen und Schnittstellen.  Explizite Definition einer Schnittstelle ( interface ) für fernaufrufbare Objekte ist üblich, aber nicht obligatorisch.

7 7 vs8.1.6  Fernerzeugung eines öffentlichen Objekts (SAO): Erzeugung wird lokal vorbereitet, aber erst dann durchgeführt, wenn der erste Klient Interesse zeigt ChannelServices.RegisterChannel( new TcpServerChannel(4711)); RemotingConfiguration. RegisterWellKnownServiceType( typeof(Server), „Service", WellKnownObjectMode.Singleton); d.h. ein Objekt mit Zustand (im Gegensatz zu SingleCall )

8 8 vs8.1.6 Klient arbeitet wie bei  : Server s = (Server)Activator.GetObject( typeof(Server), "tcp://obelix:4711/Service"); Achtung: Hier taucht weder beim Klienten noch beim Anbieter ein new auf. Das Objekt wird mit einem argumentlosen Konstruktor erzeugt. Es gibt also keine parametrisierte Initialisierung.

9 9 vs8.1.6  Fernerzeugung eines privaten Objekts (CAO): Objekt wird auf anderem Rechner erzeugt, und der Erzeuger erhält einen Fernverweis darauf Server: RemotingConfiguration. RegisterActivatedServiceType(typeof(Server)); Klient: Fernerzeugung mit Angabe von Konstruktor-Argumenten object[] attr = {new UrlAttribute("tcp://host:4711")}; object[] args = {"some constructor argument"}; Server s = (Server)Activator.CreateInstance( typeof(Server), args, attr);

10 10 vs Programmerstellung Datei server.cs enthält public class Server : MarshalByRefObject { public string echo(string s) {... } Datei main.cs enthält public class ServerMain { public static void Main() { // prepare Server object and wait..... Datei client.cs enthält public class Client { public static void Main() { // use Server object..... Dateiname und Klassenname dürfen verschieden sein!

11 11 vs8.1.6 csc /t:library server.cs erzeugt server.dll csc /r:server.dll main.cs erzeugt server.exe csc /r:server.dll client.cs erzeugt client.exe Anklicken von server.exe startet den Server Anklicken von client.exe startet den Klienten

12 12 vs8.1.6 Falls Implementierung des Dienstes (Klasse Server ) nicht beim Klienten bekannt, Schnittstelle verwenden: public interface Service { string echo(string s); } public class Server : MarshalByRefObject, Service {..... } public class Client { public static void Main(string[] arg) { Service s = (Service)Activator.GetObject( typeof(Service), "tcp://host:4711/Service");..... }} ! Bei Aufruf muß Schnittstelle beim Server gleichen Namen haben, und Operation/Signatur muß unterstützt werden – wird alles dynamisch geprüft !

13 13 vs Callbacks Klienten-Objekt: public class CallbackClient : MarshalByRefObject { public string getName() { return "client"; } Server-Objekt, tätigt Callback: public class CallbackServer : MarshalByRefObject { public string sayHelloTo(CallbackClient c) { return "hello " + c.getName(); }

14 14 vs8.1.6 Klienten-Prozess, übergibt Klienten-Objekt an Server-Objekt: public class ClientMain { public static void Main() { TcpChannel chan = new TcpChannel(4712); ChannelServices.RegisterChannel(chan); CallbackClient c = new CallbackClient(); CallbackServer s = (CallbackServer) Activator.GetObject( typeof(CallbackServer), "tcp://host:4711/Service"); Console.WriteLine("server says: " + s.sayHelloTo(c)); }

15 15 vs8.1.6 Server-Prozess, erfordert speziellen Kanal: public class ServerMain { public static void Main() { // setup channel that deserializes remote references IDictionary props = new Hashtable(); props["port"] = 4711; BinaryClientFormatterSinkProvider clientProv = new BinaryClientFormatterSinkProvider(); BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider(); serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; TcpChannel chan = new TcpChannel(props, clientProv, serverProv); ChannelServices.RegisterChannel(chan); // setup and bind server CallbackServer s = new CallbackServer(); RemotingServices.Marshal(s, "Service"); Console.ReadLine(); // wait... } TCP-Channel Anwendung ClientServer Filter

16 16 vs8.1.6 Herausziehen der Argumente aus der Erzeugungsoperation und stattdessen Übergabe an eine Konfigurierungs-Operation ermöglicht Fernerzeugung mittels new (nur parameterlos!) für  und  : RemotingConfiguration. RegisterWellKnownClientType( typeof(Server), "tcp://host:4711/Service"); Server s = new Server(); // no Activator.GetObject RemotingConfiguration. RegisterActivatedClientType( typeof(Server), "tcp://host:4712/"); Server s = new Server(); // no Activator.CreateInstance Separate Konfiguration

17 17 vs8.1.6 Auslagerung der netzspezifischen Daten wie Rechnernamen, Portnummern, Protokollnamen, … aus dem Programmtext in Konfigurationsdateien (XML)  erlaubt deren Änderung ohne Neuübersetzung,  flexibilisiert die Installation,  verbessert die Verteilungsabstraktion.

18 18 vs8.1.6 und Datei server.exe.config mit folgendem Inhalt: Klasse Assembly ( server.dll ) Serverseitig für  : RemotingConfiguration.Configure("server.exe.config"); Server s = new Server(); Konvention: Programm +.config

19 19 vs8.1.6 Klientenseitig für  : RemotingConfiguration.Configure("client.exe.config"); Server s = new Server(); und Datei client.exe.config mit folgendem Inhalt:

20 20 vs Parametermechanismen Parameterübergabe in C#: op(int n) Wertparameter (call-by-value) op(ref int n) Variablenparameter (call-by-reference) op(out int n) Variablenparameter, evtl. nicht belegt... bei einfachen Typen. Bei Verweistypen zusätzlich..... Bei Fernaufrufen: call-by-value Bei Fernaufrufen: call-by-value-result ! Bei Fernaufrufen: call-by-result !

21 21 vs8.1.6 Bei Verweistypen zusätzlich beachten (bei Argumenten und Ergebnissen!):  Wenn Objekt fernaufrufbar ( MarshalByRefObject ): Fernverweis wird übergeben;  sonst, wenn Objekt serialisierbar ( [Serializable] ): Objektkopie wird übergeben;  sonst: Ausnahmemeldung  Probleme wie bei Java RMI (8.1.5  )!8.1.5


Herunterladen ppt "1 vs8.1.6 8.1.6.NET Remoting.Net („dotnet“) :von Microsoft eingeführte Plattform für verteilte Anwendungen, virtuelle Maschine für die verteilte Ausführung."

Ähnliche Präsentationen


Google-Anzeigen