Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Sophie Feld Geändert vor über 7 Jahren
1
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 von Programmen in unterschiedlichen Sprachen C# („Csharp“) :Referenzsprache für.NET, Microsoft‘s Antwort auf Java.NET Remoting :Fernaufrufe auf der.NET-Plattform http://msdn.microsoft.com/library/en-us/dndotnet/html/hawkremoting.asp http://msdn.microsoft.com/library/en-us/dndotnet/html/introremoting.asp http://www.ingorammer.com/remotingFAQ http://www.inf.fu-berlin.de/~lohr/slides/dotnetrem.ppt
2
2 vs8.1.6 8.1.6.1 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 vs8.1.6 8.1.6.2 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 vs8.1.6 8.1.6.3 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 8.1.6.4 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: <wellknown mode="Singleton" type="Server,server" objectUri="Service"/> 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: <wellknown type="Server,client" url="tcp://host:4711/Service"/>
20
20 vs8.1.6 8.1.6.5 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
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.