Download præsentationen
Præsentation er lastning. Vent venligst
Offentliggjort afLeif Bendtsen Redigeret for ca. et år siden
1
Uge 14: distribuerede objekter, fjernprocedurekald, RMI Tirsdag: Introduktion Mulige fordele ved distribuerede objekter Introduktion til RMI: - Interfacets rolle - Tekniske detaljer ved programmering - Stubbe og skeletter Farleys re-konstruktion af RMI Torsdag: Anvendelse af Javas RMI. Parametre til fjernprocedurekald Farleys solver-program
2
Eksempel: Webservice som styres fra separat maskine Du skal udvikle en webservice webserver = Farleys webserver (udvidelse = f.eks. e-handelsprogram, søgefacilitet,..) Og bagefter selv være administrator på den Servicen skal afvikles hos Internetudbyder/webhotel, hvor du lejer maskine (evt. virtuel maskine). Administration skal kunne ske fra fjern maskine (f.eks. hjemmefra via modem) start, stop konfigurering af webservicen: hvem må bruge den, til hvad ?
3
Opgave Kan vores webservice startes og stoppes via: telnet ? ftp ? http ? sockets ? fjernprocedurekald ?
4
Ren tekstbaseret kommunikation.. klient server "hello.... set category 1 users:,,.... stop service no. 3.... raise priority of service no. 2.. bye" Nødvendigt at konstruere parser - f.eks. udvidelse af Farleys class SimpleCmdInputStream Mange fejlmuligheder, - mange fejl først vil vise sig på køretidspunktet ?
5
Fordele ved distribuerede objekter og fjernprocedurekald Højniveau-programmering lade systemet (oversætter, RMI,..) håndtere detaljer jf. løkker i stedet for GOTO-sætninger, Java i stedet for C,.. Typecheck vil afsløre fejl allerede på oversættelsestidspunktet "metoden set_categyro findes ikke.." Muliggør udarbejdelse af abstrakt design Overordnet design kan abstrahere fra fordeling af objekter på processer og maskiner CORBA: højere abstraktionsniveau end RMI: uafhængig af programmeringssprog
6
Java Gently, class ActualThing Formål Metoden getThing() skal kunne kaldes fra fjerne objekter class ActualThing { ActualThing(String n) {age = n} public String getThing() {return age} private String age; }
7
class ActualThing Formål (II) a = new ActualThing("I am 46"); {registrer objekt hos naming service} {T = objekt, via naming service} System.out.println(T.getThing()); Klient Server tid
8
God (distribueret) programmeringsstil Klientens variabel t skal pege på objekt hos serveren. Hvilken type skal t erklæres som ? - God programmeringsstil: definer type som fastlægger netop de metoder, der kan kaldes fjernt typen defineres i form af et interface (f.eks. "Thing") erklær t som denne type Hvordan kan klienten finde objektet hos serveren ? - Via naming service Server registrerer objekt under et vist navn (f.eks. "Thing Service") Klient bruger navnet som indgangsnøgle til at finde objekt
9
Grænsefladen ml. klient/server: Interface Thing.. a = new ActualThing("I am 46"); Naming.rebind("Thing Service",a).. String url = "rmi://" + host/"; Thing t = Naming.lookup( url + "ThingService); System.out.println(T.getThing());.. Klient Server ThingServer.java interface Thing { String getThing(); } Thing.java class ActualThing implements Thing { ActualThing(String n) {age = n} public String getThing() {return age} private String age; } ActualThing.java ThingClient.java
10
+ teknik: Nedarvning: interface Thing nedarver fra interface java.rmi.Remote class ActualThing nedarver fra class UnicastRemoteObject De rigtige exceptions skal kastes og fanges: netværksprogrammering er særlig udsat for fejl så struktureret fejlbehandling er ekstra vigtig Type-casting: Objektet, som naming service returnerer til klienten, skal type-castes til Thing
11
Type-casting Implicit type-konvertering: int i = 0; float f = i; System.out.println(f); Type-casting = eksplicit programmeret type-konvertering float f = 1.1; int i = (int) f; System.out.println(i); public java.rmi.Remote lookup(){..};.. Thing t = (Thing) Naming.lookup() Procedure lookup returnerer et objekt af typen java.rmi.Remote
12
Naming Service (RMI registry) a Proces A Proces B Thing Service Proces C Har du et objekt ved navn "Thing Service" ? Reference til a
13
"Stubbe" og "skeletter" Klient Server Har du et objekt ved navn "Thing Service" ? Reference til "stub"som har reference til a ThingClientThingServer StubSkelet Oprettelse af reference til fjernt objekt brug
14
Skabelse af stubbe og skeletter Thing.java ActualThing.java ThingClient.java ThingServer.java Thing.class ActualThing.class ThingClient.class ThingServer.class ActualThing_Stub.class javac rmic ActualThing_Skel.class X.java javac Kommando: javac X.java
15
RMI tilbyder Naming service, som er/kan overføre referencer til objekter blot ved at klient angiver 1. Typen af det fjerne objekt. 2. Navnet som objekt er registreret under overføre metodekald, herunder parametre og retur-værdi
16
Farleys rekonstruktion af RMI S. 49:.. String cmd = "call " + methodIdx + " on " + objRef;.. Tekst der sendes via alm. socket forbindelse fra klient til server Heltal somklient har modtaget fra server (server bruger det til opslag i hashtabel) Heltal som betegner metodens nummer ud af samtlige metoder som er defineret i objektet
17
Class.forName(..) og Class.newInstance() Statisk (normal) loadning: MyClass obj = new MyClass(); Dynamisk loadning: Class cls = Class.forName("MyClass"); obj = cls.newInstance(); samme Forudsætter at MyClass.class er tilgængelig lokalt via CLASSPATH
18
Dynamisk valg af klasse og metode String cName = "ActualThing"; // eller fra socketforb. Class reqClass = Class.forName(cName); Object obj = reqClass.newInstance(); // ActualThing obj = new ActualThing(); String mName = "getThing"; // eller fra socketforb. Method reqMethod = reqClass.getDeclaredMethod(mName,null); String s = (String) reqMethod.invoke(obj,null); // s = obj.getThing(); System.out.println(s.getThing()); // eller til socketforb. // tilføjet efter forelæsning: // mangler at overføre parametre til kaldet af // ActualThing-konstruktoren // (så forstår jeg bedre jeg ikke kunne få det til at virke. )
19
java.lang.Class & …Method Kun kvalifikatoren statisk er vist, alle andre er udeladt. Class: package java.lang; class Class { static Class forName(String className) {..} Method getDeclaredMethod(String methodName,Class[] paramTypes){..} Method[] getDeclaredMethods(){..} Object newInstance() {..} } Method: package java.lang.reflect; class Method { void invoke(Object obj,Object[] params) {..} }
Lignende præsentationer
© 2024 SlidePlayer.dk Inc.
All rights reserved.