programmera.net -> java -> normal     för utskrift      info@programmera.net

RMI

1. Vad har man RMI till?
2. Hur fungerar RMI?
3. Sockets eller RMI?

1. Vad har man RMI till?

RMI (Remote Method Invocation) används till att låta Javaprogram kommunicera med varandra över nätverket eller internet.

2. Hur fungerar RMI?

I RMI har man inte bara en server och en klient, utan också ett register:

  • Registret är en speciell process som känner till vilka objekt som finns på servern. Regsitret startas på serverdatorn och lyssnar efter inkommande förfrågningar på porten 1099 (RMIs defaultport).
  • Servern registrerar sina objekt hos registret innan de kan nås från andra datorer. Efter registreringen gör severn ingenting, ingen loop behövs för att lyssna.
  • Klienten kommer åt serverklasserna indirekt via en stubbe (en speciell klass) som i sin tur tar kontakt med en skelettklass på serversidan. Eftersom stubben ligger lokalt hos klienten kan serverklasserna användas som om de låg lokalt på klientdatorn. Enda skillnaden för klienten är att alla klasser som inte ligger lokalt kastar RemoteException, så helt genomskinligt blir det inte.
Bilden nedan visar de klasser som behövs för att en klientklass ska kunna använda sig av klassen Z (som ligger på en annan dator):



De tre stegen beskrivs nedan:
  1. Först måste klassen Z registreras i registret, detta sköts av serverklassen med följande kod:
    Naming.rebind ("Z", new Z());
  2. För att skapa ett objekt av Z gör klientklassen ett uppslag i registret. Klienten vet inte vilket objekt som kommer skapas, men genom att skapa objektet som ett objekt som implementerar gränssnittet ZInterface kan man använda de metoder som definieras av ZInterface. För att detta ska fungera måste ZInterface ligga både hos klienten och på servern.
    ZInterface z = (ZInterface) Naming.lookup ("rmi://myserver.mycompany.com/Z");
  3. När nu klienten använder objektet z kommer kommunikationen med servern skötas av stubben och skelettet utan att klienten behöver bekymra sig om hur det går till. Ett anrop ser ut som vanligt, se exemplet nedan:
    int x=z.doSomething(17);
    (Detta fungerar om metoden doSomething() finns specad i ZInterface.)

3. Sockets eller RMI?

RMI gör alltså sammma sak som  Sockets , hur vet man då vad man ska välja? I allmänhet är RMI bättre, eftersom det lyfter kommunikationen till en högre nivå:

  • I en Socket så sker kommunikationen på låg nivå, närmare bestämt som via text. Texten måste tolkas både hos server och klient, och man måste i princip uppfinna ett eget protokoll för mer avancerade tjänster.
  • Med RMI sker kommunikationen på hög nivå. En klass på en avlägsen maskin används precis som om den ligger lokalt, den bara initieras annorlunda.
En annan fråga som kan vara viktig då man har ett stort antal klasser på servern är hur många portar som används:
  • Med Sockets måste man ta upp en ny port på servern för varje kanal man vill använda.
  • Med RMIs register nås alla serverklasserna från samma port.
Inte för att det är ont om portar, en dator har ju 65 tusen, men det är jobbigt att hålla reda på vilken port som används till vad. Allt verkar tala för RMI, men tyvärr är det lite mer pyssel med RMI, man måste nämligen göra ett gränssnitt och en stubbe som ska flyttas till klienten.
  • Ett gränssnitt som beskriver den klass man vill använda måste finnas på klienten för att klienten ska veta vilka publika metoder en avlägsen klass har.
  • En stubbe (_Stub.class) måste skapas och kopieras till klienten för att kommunikationen ska fungera.
Denna startsträcka gör kanske att vissa väljer kommunikation på lägre nivå.