Plan 12.3. Oversigt over grundlæggende begreber Java: eksempel på applikation, programmering og oversættelse Uddybning af grundlæggende begreber Java RMI implementation Forklaring af øvelsen Hvad er et distribueret objekt? Et objekt hvis metoder kan kaldes fra andre processer dvs. som tillader fjernprocedurekald ( fjernmetodekald?) bemærk metoden udføres lokalt principielt processer som kører på forskellige maskiner ikke nødvendigvis fjerne kald/brug af konstruktorer eller attributter De basale problemer: hvordan etableres forbindelse til objekt i en anden proces? hvordan kommunikeres hvilken metode, der ønskes kaldt? hvordan overføres parametre og returværdi? Design spørgsmål: hvorledes opnås en passende transparens? semantik: hvad er opførslen i tilfælde af fejl? Objekter: notation Class Client <kode dvs. definitionen af class Client> et objekt, som er en instans af class Client Objekter, objektreferencer, metoder, parameteroverførsel Class Client Server s = new Server; Data d = new Data(); String txt = s.p(d); s.p(d) class Server // konstruktorer server(){..; // attributter Worker w; class Data objektet har en attribut, som er en instans af class Data class Data <en tekst> // metoder String p(data d){..; Objektreference (variabel): kan være implementeret som C pointer (tænk på pointer til datastruktur i C) Metodekald (lokalt): vil være oversat til maskinkode eller bytecode bruger ikke nødvendigvis navnet p
Opgave: Skriv pæn definition af class Client Løsning Class Client Server s = new Server; Data d = new Data(); String txt = s.p(d); Class Client Server s = new Server; Data d = new Data(); String txt = s.p(d); Class Client Server s; String txt; public Client () { s = new Server(); d = new Data(); public void gettext() { txt = s.p(d); Distribuerede objekter: begreber Navneservice: service som returnerer referencer til distribuerede objekter ud fra symbolske, globale navne (tekster) Reference til distribuerede objekter ( fjernreference?) En objektreference, som logisk set refererer til et distribueret objekt Parameteroverførsel parametre til fjernprocedurekald bør kunne være af vilkårlig type, herunder være et vilkårligt objekt call by value: overførsel af kopi, vs. call by reference: overførsel af reference Marshalling: forbehandling af argumenter til fjernprocedurekald, især serialisering: transformation af objekter til bytesekvens Stub (proxy): et objekt på klientsiden som kaldet går igennem Skelet: et objekt på serversiden som kaldet går igennem Dispatcher: tråd på serverside, som modtager kaldet, behandler evt. dette ved at kalde metoder i skelettet A Referencer i fjernprocedurekald (jf. CDK figur 5.6) Stub Fjernref. modul Komm Klient med objekt A Komm Fjernref. modul Skelet A har en fjernreference til B refererer logisk set til B. A s fjernreference er i virkeligheden en reference til stubben (svarer til en C pointer). Stubben indeholder en egentlig, global reference til B (en datastruktur med IP nummer m.m.). Den globale reference til B oversættes af fjernreferencemodulet hos serveren til en lokal reference til B (igen svarende til en C pointer). Navneservice ikke vist på tegning B Server med distr. objekt B
Plan 12.3. Hello World! Opgave 1 Oversigt over grundlæggende begreber Java: eksempel på applikation, programmering og oversættelse Uddybning af grundlæggende begreber Java RMI implementation Forklaring af øvelsen HelloApplet sayhello() Hello World! Klientprogram: applet som ikke selv ved hvad den skal skrive ud. HelloImpl String sayhello() { return Hello World! ; Serverprogram: indeholder distribueret objekt med sayhello() kunne være kompliceret server, som vi vil styre via browser Opgave 1: klientsidens kildetekst <html> <applet codebase=../../classes/ code=rmihello.helloapplet width=350 height=120> </applet> </html> package RMIHello; import..; public class HelloApplet { Hello obj; String msg; void init() { try { lookup() modtager //127.0.0.1/HelloServer og returnerer en fjernreference obj = (Hello)Naming.lookup( // + getcodebase().gethost() + /HelloServer ); msg = obj.sayhello(); catch (..) {.... Opgave 1: et interface som både server og klient skal kende package RMIHello; import..; public interface Hello implements Remote { public String sayhello() throws RemoteException;
Opgave 1: serverens kildetekst package RMIHello; import..; public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl { super(); // eksporterer objektet // dvs. indføjer i det lokale kommunikationsmodule public String sayhello() { return Hello World! ; // definerer metoden der kan kaldes fjernt public static void main(..) {.. // security manager try { HelloImpl obj = new HelloImpl(); Naming.rebind( HelloServer,obj); // offentliggører objektet under symbolsk navn catch (..) {.. Klient Brug af RMI Registry et obj = (Hello)Naming.lookup (..HelloServer ); msg = obj.sayhello(); tid Server obj = new HelloImpl(); Naming.rebind( HelloServer,obj); Opgave 1: oversættelse Brug af "Stubbe" Hello.java HelloApplet.java HelloImpl.java javac javac javac Hello.class HelloApplet.class HelloImpl.class Oprettelse af reference til fjernt objekt Klient Har du et objekt ved navn "HelloServer"? Stub bytecode + stub instans Server Kommando: javac X.java X.java javac rmic v1.2 HelloImpl_Stub.class brug Klient Stub Server
Opgave 1 kør RMI involverer tre processer maskine 1: <prompt> java rmiregistry & <prompt> java RMIHello.HelloImpl maskine 2: <prompt> appletviewer RMIHello/hello.html Proces A Har du et objekt ved navn "o"? Den tredje proces (C): På serversiden er der også en naming service objektet obj er registreret under navnet "o" obj Proces B o Proces C Ny opgave: skriv almindelig Java klient, som svarer til HelloApplet package RMIHello; import java.rmi.naming; import java.rmi.remoteexception; public class HelloClient { String message = "blank"; Hello obj = null; public HelloClient() { try { obj = (Hello)Naming.lookup("//127.0.0.1/HelloServer"); message = obj.sayhello(); catch (Exception e) { System.out.println("HelloClient exception: " + e); public static void main(string args[]) { HelloClient hc = new HelloClient(); System.out.println(hc.message);
Plan 12.3. Oversigt over grundlæggende begreber Java: eksempel på applikation, programmering og oversættelse RMI Middleware Softwaren som muliggør grænseflade til fjerne objekter: metodekald oprettelse af referencer Implementeret vhja. sockets Uddybning af grundlæggende begreber Java RMI implementation Forklaring af øvelsen Marshalling/unmarshalling serialisering, genskabelse af struktur fejlhåndtering oversættelse af referencer A Stub Komm Fjernref. modul Opgave 1: Stubbe Java serialisering // Bytecode for class HelloImpl_Stub samt en instans af den overføres til klient // på passende tidspunkt Class HelloImpl_Stub public String Hello() { <serialize> <send to remoteobj> <remoteobj> public class Person implements Serializable { private String name; private String place; private int year; public Person(String n, String p, int y) { name = n; place = p; year = y; Muliggør entydig konvertering mellem objekter og bytesekvenser Serialiser et objektet dannet med sætningen Person p = new Person( Jensen, Kbh. + / + DK, 1975); Hvorfor overføre klassenavn? versionsnummer?
To måder at overføre objekt referencer mellem processer (1) Via naming service jf. HelloServer (2) Som parametre til fjernprocedurekald Opgave: hvordan bruges metode (2) i CDK s tavle eksempel? Fælles: de objekter, der overføres referencer til, skal implementere et interface, som er kendt hos både server og klient, og som nedarver fra java.rmi.remote de objekter, der overføres referencer til, skal være instanser af klasser som der på server siden er genereret stubbe til Forskel: (1) kræver rebind()/lookup i rigtig rækkefølge (1) kræver brug af symbolsk navn på det/de distribuerede objekter Fejlhåndtering, RMI request/reply protokol Basis for kommunikationsmodulet i Java RMI er en request/reply protokol med tre basale operationer: byte[] dooperation(remoteobjectref r, methodid m, byte[] args) sender fjernprocedurekald, efter serialisering, fra klient til server. ud fra r, findes (ip,port) m pakkes med ind i bytesekvens byte[] getrequest() lytter efter andre processer, der har kaldt dooperation() sendreply(byte[] r, InetAddress ip,int port) sender svar Oversættelse af referencer Når getrequest() modtager et kald af byte[] dooperation(remoteobjectref r, methodid m, byte[] args) skal objekt og metode findes (og argumenter skal genskabes som objekter). Objekt findes via fjernreferencemodul. Metode findes enten via skelet (i JDK 1.1) eller via Javas reflektion (i JDK 1.2 og senere). Skal dooperation gentages hvis der ikke kommer svar? Skal getrequest filtrere dubletter?
Plan 12.3. Refleksion Oversigt over grundlæggende begreber Java: eksempel på applikation, programmering og oversættelse Uddybning af grundlæggende begreber Java RMI implementation: refleksion tråde/synkronisering RMISecurityManager Forklaring af øvelsen Reflektion i Java: klasser kan forholde sig til sig selv! for en givent navn på en klasse, kan man få en reference til et objekt, der repræsenterer klassen (et class Class objekt) for et givet class Class objekt, kan man få en reference til et array af objekter, der repræsenterer klassens metoder. C har en begrænset refleksiv facilitet idet C programmet har adgang til deres eget stinavn main(int argc, char * argv[]) { printf( usage: %s <filnavn>, argv[0]);.. Class: package java.lang; java.lang.class & java.lang.reflect.method class Class { Class forname(string classname) {.. Method getdeclaredmethod(string methodname, Class[] paramtypes){.. Method[] getdeclaredmethods(){.. Method: package java.lang.reflect; class Method { void invoke(object obj,object[] params) {.. obj = (Hello)Naming.lookup (..HelloServer ); msg = obj.sayhello(); RMI og tråde obj = new HelloImpl(); Naming.rebind( HelloServer,obj);... obj.sayhello(); //??? Metoder (f.eks. sayhelloi()) i distribuerede objekter kan blive udført af flere tråde samtidigt. Hvilke tråde? Er det et problem?
(RMI)SecurityManager I Java er et SecurityManager objekt et objekt der håndterer sikkerhed for en proces: hvilke fremmede maskiner må tråde i processen kontakte (via sockets)? hvilke klasser må downloades fra fremmede maskiner? En SecurityManager styres af en sikkerhedspolitik fil og/eller ved at overskrive metoder i class SecurityManager // fra class HelloImpl if (System.getSecurityManager == null) { System.setSecurityManager = new RMISecurityManager(); try { HelloImpl obj = new HelloImpl(); Naming.rebind(HelloServer,obj); catch (..) {.. UnsafeRMISecurityManager UnsafeRMISecurityManager() { super(); public void checkconnect(string host,int port) { if ( host.equals("lt nielsj") host.equals("127.0.0.1") ) { System.err.println("Accepting.. ); else super.checkconnect(host,port); Plan 12.3. Oversigt over grundlæggende begreber Opgave 2 Tilføj en metode HelloImpl.sayHello() der tager et argument hvis værdi angiver hvilket sprog, der skal siges "hallo" på. Java: eksempel på applikation, programmering og oversættelse Uddybning af grundlæggende begreber Java RMI implementation Forklaring af øvelsen HelloApplet sayhello( Danish ) Hej Verden! HelloImpl
Opgave 3 Et fjernt objekt hos klienten skal angive sproget/nationaliteten. HelloApplet HelloImpl sayhello(myid) Hej Verden! IdImpl getid() Danish