Förra föreläsningen: Olika nivåer av meddelanden. Från oblockad sändning till. RPC: Parameterpassning, registrering, felhantering, säkerhet, kompilering ONC RPC: XDR, portmapper Brandväggar, dynamisk brandväggskonfigurering, proxies, relays (vad behövs för att köra RPC genom en brandvägg?) Idag: RMI, CORBA 1
Tydlig parallell med Remote Procedure Call Men skillnaden finns där: RMI är objekt-orienterat. RMI bygger på JVM (Java Virtual Machine). Inget speciellt språk för datatypsdeklaration (som XDR). Använder -deklarationer istället. 2
Väldigt förenklat (på gränsen till lögn): Objektorienterat språk. Både kompilerat, och interpreterat. Interpretationen av den kompilerade koden,, sker i en miljö som heter JVM. Bytekoden är plattformsoberoende. Varje klass ligger normalt i en egen.java-fil. Vid kompileringen skapas en.class-fil som innehåller bytekoden. Länkning sker dynamisk och sker via inladdning av.classfiler. 3
Väldigt förenklat (på gränsen till lögn): Datatyperna är antingen primitiva (int, long, boolean, mfl), eller objektstyper (referenstyper). Storleken på de primitiva datatyperna är plattformsoberoende. Endast referenser lagras till objektstyperna. Automatisk minneshantering finns ( ) som rensar objekt utan referenser. Ett språk för Internet. anpassat för IP. Inbyggt stöd för trådar (inkl synkroniseringsmekanismer) 4
- - - - - 5
1. Dataöverföring och parameterpassning. RMI utnyttjar det faktum att JVM och Javas typer är binärkompatibla. Dataöverföringen bygger på att typer är. (java.io.serializable) Det finns tre typer av parameterpassning: Primitiva typer: Call-by-value Objekttyper: Call-by-copy (skiljer sig från Java) Fjärrobjekttyper: Call-by-reference (som Java). Deklararas som interface 6
2. Registrering Portmappern måste startas. I det här fallet: rmiregistry. Den opererar normalt på port 1099. Kommunikationen sker utanför rmiregistry. Servern: Binder ett objekt (av referenstyp) till ett namn (sträng) hos rmiregistry. Exempel: Naming.rebind( rmi://peppar/myserviceobject, object); Klienten hittar objektet med: Nåja, nästan. Naming.lookup( rmi://peppar/myserviceobject ); 7
3. Felhantering The OO way: Exceptions Vanligast: java.rmi.remoteexception. Kan vara exempelvis en ConnectException. Dessa tvingas man att ta hand om. (Bra) Snyggt är att Exception ärver av Throwable, som implementerar Serializable. Vad innebär det? Jo, man kan kasta alla Exceptions, även de egendefinierade. 8
4. Säkerhet Men, man kan byta ut kommunikationslagret mot sin egen SocketFactory. 9
5. Kompilering Vid överföring av referensobjekt (exemplevis det objekt man binder), krävs det att man: 1. Kompilerar interface-deklarationen, som ärver av java.rmi.remote. 2. Kör rmic för att generera stubbe och skelett. 3. Kompilerar implementationsklassen. För de andra typerna (primitiva och objektstyper), behöver man inte gör något särskilt (förutom att ärva java.io.serializable) 10
Två implementationer av den körkortsdatabas vi implementerade mha ONC RPC förra gången. En där vi helt enkelt frågar efter körkortet och får det returnerat (väldigt lika ONC RPC-exemplet) Och en där vi i stället för ett körkort får en referens till ett körkort. Och koden, den hittar ni under: och 2 * 1 0 /. +!-#!,, +*!''!) $ (' &% %!$ # #!" 11
Licens -databas. Fem klasser: License: Innehåller bara data, en konstruktor och en hjälpmetod. LicenseDatabase: Innehåller ett interface, som visar vad vi kan göra med databasen. LicenseDatabaseImpl: Implementationen av denna databas. LicenseServer: Enkel klass, som binder implementationen till namnet LicenseDatabaseService. LicenseClient: Hämtar en referens till databasen, genom att fråga efter LicenseDatabaseService, och ställer en fråga. 12
5 4 6 7 8 3. Servern registrerar LicenceDatabaseImpl som en LicenseDatabase LicenseDatabase rmiregistry. Klienten frågar efter LicenseDatabaseService, får en LicenseDatabase LicenseDatabase LicenseServer LicenseDatabaseImpl. Serverns LicenseDatabaseImpl får anropet, returnerar en License LicenseDatabase License. License överförs som vanligt (endast data) LicenseClient. Klienten anropar LicenseDatabase:ns getlicense med en int, som överförs som vanligt, tillsammans med en referens till LicenseDatabase. Klienten anropar License:ns mytostring, som ett vanligt, lokalt, metodanrop. 13
Starta tre X-fönster varav två på samma maskin. Gå till biblioteket med källkoden i alla fönster. Gör make. I fönster 1: /opt/jdk/1.2.2/bin/rmiregistry I fönster 2 (på samma dator som fönster 1): /opt/jdk/1.2.2/bin/java LicenseServer I fönster 3: /opt/jdk/1.2.2/bin/java LicenseClient Varför måste fönster 1 och 2 vara i på samma dator? 14
Sex klasser: LicenseDatabase, LicenseDatabaseImpl, LicenseServer, LicenseClient: som tidigare (fast med nya funktioner) License: Nu ett interface till en (fjärr)referensklass. LicenseImpl: Implementationen av License. Ett undantag: LicenceNotFound Nu måste vi köra rmic två gånger: En gång för License och en gång för LicenseDatabaseImpl. 15
9 : ; @ > =? < A. LicenseDatabase rmiregistry LicenseDatabase LicenseServer License LicenseDatabaseImpl License LicenseImpl String. LicenseDatabaseImpl får anropet, returnerar en License, som är en referens till en LicenseImpl. LicenseImpl får anropet, returnerar en String, som är en serialiserbar typ, och därför.... skickas den som vanligt data.. LicenseDatabase LicenseClient.. Licensereferensen överförs som referens. Klienten anropar mytostring på Licensen. Men eftersom det är en referens, så. skickas den tillbaka till servern. 16
Kraftfull modell, ger snygg transparens mellan lokala och perifera (centrala) objekt. Ger en delikat avvägning: Var ska egentligen objekten finnas? ( vilka objekt ska vara RemoteObjects och vilka ska vara Serializable?) Fördelar med lokala objekt: Snabb åtkomst. Fördelar med centrala objekt: Kan fungerar som referenser till databaser. Servern har fortfarande kontroll över vilken information som lämnas ut. 17
Servern kan utföra genom att klienten skickar över RemoteObjects som refererar till egna, lokala, objekt. Genom att servermetoden anropar metoder i dessa objekt, så kan klienten få information om framåtskridande, varningar mm. Hur kan klienten skicka - information till servern? Jo, genom att anropa ytterligare en metod! RMI implementerar en distributed garbage collection, DGC, som hanterar fjärreferenser till lokal objekt. (Varför? Och, vad händer om en klient dör?) RMI har stöd för automatisk distribution av klasser (kod)! Överkurs. 18
RMI är konstruerat med tanke på brandväggar: Endast en TCP-uppkoppling mellan datorerna används. Kommunikationen på den uppkopplingen. RMI kan operera via HTTP-protokollet. proxy http http säkerhetshål RMIklient webserver RMIserver 19
En snabb politisk överblick: OMG: Object Management Group. Grundades 1989 av 8 företag (bl a 3Com, HP, Philips, Sun). Hade 750 medlemmar 1997, världens största industrikonsortium. CORBA Common Object Request Broker Architecture: En specifikation för bland annat hur en ORB fungerar. 20
1. Dataöverföring och parameterpassning. CORBA är avsett för många plattformar. Vi kan därför inte utnyttja Javas binärkompabilitet på samma sätt som RMI gör. Nej, vi får ta till ett nytt språk: IDL, Interface Definition Language (jfr XDR). Språket innehåller allt man kan tänka sig: primitiva typer (hårt definierade), structar, unions, sekvenser, exceptions, moduler, osv. 21
1. Dataöverföring och parameterpassning. Koppling till Java görs med idltojava. Detta kommando skapar: Interface-deklarationer Stubbar Skelett Hjälpklasser (exvis Holders, för och - parametrar) Obs: Både case-sensitive och inte..! 22
2. Registrering CORBA klarar sig utan portmapper! Men, då får man lov att hitta en IOR (Interoperable Object Reference) till det objekt man vill komma åt. Givetvis finns det även sätt att registrera objekt. Det görs med Naming Service. Ett sådant program är tnameserv (Transient Name Server). (Detalj: defaultar till port 900, ändras med ORBInitialPort) 23
3. Felhantering CORBA använder undantag. Men man måste deklarera dem själv. CORBA-modulen självt använder av 26 standardundantag. Varje sådant undantag har en flagga, som sätts till något av COMPLETED_YES, COMPLETED_NO, COMPLETED_MAYBE, tillsammans med en underkod. 24
4. Säkerhet CORBA Security Service: Identification and authentication Authorization and access control Auditing Communications security Nonrepudiation Administration of security policy Överkurs 25
5. Kompilering För Java: Skapa en IDL-fil med deklarationerna (med, säg klass ) och kör idltojava. Skapa klassen Impl (t ex) och utöka _ ImplBase. Skapa serverklass (med main) som skapar en ORB och en instans (objekt) av Impl och eventuellt binder objektet till ett namn. Servern ska sedan vänta. 26
5. Kompilering Skapa en klientklass (med main) som med hjälp av antingen en explicit IOR eller Naming Service, hittar ett org.omg.corba.object. Använd sedan narrow för att få en referens till en. 27
Två kommunikationsprotokoll finns specificerade: General Inter-ORB Protocol (GIOP) För kommunikation utan transportprotokoll. Specificerar bland annat. Men, det finns även funktioner för kommunikation genom HTTP-proxies. Internet Inter-ORB Protocol (IIOP) Specialisering av GIOP för kommunikation över TCP. 28
Tidigare sågs Java ORB och RMI som konkurrenter. Detta börjar lösas upp: RMI börjar stödja IIOP som transportprotokoll. OMG justerar sin object-by-value så att den är kompatibel med RMI. RMI blir till en speciell form av Java ORB som döljer IDL-skapandet för användaren. Finns fortfarande frågetecken. 29
java.sun.com can t live without it www.omg.org (och www.corba.org) (Utdelad litteratur: http://www.infosys.tuwien.ac.at/research/corba/archive/intro/osr.ps.gz) 30