Søger du en specifik kategori?

 



Oprettet tir. d. 16. februar 2010 kl. 02:37

arne_v
arne_v (1.005.403 point)
Guidens karaktér
1
2
3
4
5

RMI introduktion

Denne artikel beskriver Java RMI (Remtote Method Invocation). Den beskriver teorien bag RMI, viser et simpelt kode eksempel og forklarer hvordan det virker. Den forudsætter kendskab til Java og generel programmering men ikke til RMI.
Historie:
V1.0 - 12/01/2004 - original
V1.1 - 31/01/2004 - forbedret formatering
V1.2 - 09/02/2004 - flere ændringer af formatering
V1.3 - 16/02/2010 - smårettelser

Teori

RMI bygger på det såkaldte Proxy Pattern (et af de originale
patterns fra Design Patterns af Erich Gamma m.fl.).

Ideen er at en client kan kalde remote server kode på samme måde
som lokal kode.

Selve kaldet foregår som:

client kode--stub kode--(netværk)--skeleton kode--server kode


Stub koden har samme interface som server koden. Stub koden
pakker alle argumenter ned (serialiserer) og sender dem
over en socket til skeleton koden.

Skeleton koden udpakker alle argumenter (deserialiserer) og
kalder server koden.

Retur værdien sende tilbage på samme vis bare modsat.

Både stub og skeleton koden genereres automatisk af
et værktøj der kommer med Java SDK.

Etableringen af forbindlesen mellem client og server er speciel
og involverer noget der hedder RMIRegistry.

Serveren connecter til RMIRegistry og registerer sig under et navn.

Client connecter til RMIRegistry og slår navnet op og får returneret
et stub objekt.

Client connecter så via stub objekt til server skeleton objekt.

Eksempel

Her kommer nu et simpelt eksempel som illusterer hvordan det virker.

Calc.java


import java.rmi.Remote;
import java.rmi.RemoteException;

// interfacet som er fælles for stub og server
// skal extende Remote
public interface Calc extends Remote {
  // metoder i interfacet
  // skal throwe RemoteException
  public int add(int a, int b) throws RemoteException;
  public int mul(int a, int b) throws RemoteException;
}


CalcImpl.java


import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

// server klassen
// skal extende UnicastRemoteObject og implementere interfacet
public class CalcImpl extends UnicastRemoteObject implements Calc {
  // constructor
  // skal erklæres eksplicit
  // skal throwe RemoteException
  public CalcImpl() throws RemoteException {
  }
  // metoder fra interfacet
  // må godt men behøver ikke throwe RemoteException
  public int add(int a, int b) {
      // lidt debug så vi kan at det virker
      System.out.println("Vi er blevet bedt om at lave en add");
      return (a + b);
  }
  public int mul(int a, int b) {
      // lidt debug så vi kan at det virker
      System.out.println("Vi er blevet bedt om at lave en mul");
      return (a * b);
  }
  // simpelt hoved program til at teste med
  public static void main(String[] args) {
      try {
        // binde server objekt til RMIRegistry under navnet "Calc"
        Naming.rebind("Calc", new CalcImpl());
      } catch (RemoteException e) {
        e.printStackTrace();
      } catch (MalformedURLException e) {
        e.printStackTrace();
      }
  }
}


TestCalc.java


import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

// test client klasse
public class TestCalc {
  // hoved program
  public static void main(String[] args) {
      try {
        // slå service op i RMIregistry og hent stub objekt
        Calc c = (Calc)Naming.lookup("Calc");
        // check at service virker
        System.out.println(c.add(2,3));
        System.out.println(c.mul(2,3));
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (RemoteException e) {
        e.printStackTrace();
      } catch (NotBoundException e) {
        e.printStackTrace();
      }
  }
}


Compile .java filer til .class filer:

  javac *.java


Generere stub og skeleton udfra server implementations class fil:

  rmic CalcImpl


Starte RMIRegistry:

  rmiregistry


Starte server:

  java CalcImpl


Starte client:

  java TestCalc


RMIRegistry skal have stub i classpath.

Server skal have interface + implementation + skeleton i classpath.

Client skal have stub i classpath.

Hvad er RMI godt til og hvad er det ikke godt til

RMI er meget godt til client/server løsninger på LAN. Det er ikke
så velegnet til løsninger hvor netværket er internettet. Det giver
ofte problemer med firewalls og porte der skal åbnes. Man kan godt
få det til at virke, men til brug over internet er SOAP RPC over
HTTP (Web Services) bedre.

Som hovedregel gælder det at fordelene ved RMI er store, når man har
mange funktioner med mange argumenter som ikke fylder meget, mens
det ikke er velegnet til en funktion med et argument som kan være
meget stort (som f.eks. fil upload).

Udviklingen i Java

I nyere Java versioner behøver man ikke generere stub og skeleton på compile
time, da de kan genereres on the fly på runtime.

Men koden ovenfor virker stadig.

Videre

For avancerede emner indenfor RMI se:
  http://www.eksperten.dk/ (...)

Skrevet man. d. 12. januar 2004 kl. 23:02| #1

fint beskrevet :) ser frem til den avancerede.

Skrevet tir. d. 25. maj 2004 kl. 14:28| #2


Skrevet fre. d. 30. juli 2004 kl. 17:22| #3

ttn- (14.909 point)
Igen, som ved stortset alle dine artikler, er der alt for meget kode i forhold til tekst. Forklar og analyser hver der sker. Ellers kan man ikke rigtig kalde det for en artikel. Dog er denne sat til middel, fordi RMI ikke er så avanceret igen.

Skrevet ons. d. 08. december 2004 kl. 20:52| #4

bagnavnet (14.492 point)
Lige hvad jeg som nybegynder havde brug for!

Skrevet tir. d. 18. oktober 2011 kl. 09:49| #5

HannnaBanana (665 point)
Hmm: Hvordan skal man forstå dette stykke:

Compile .java filer til .class filer:


  javac *.java



Generere stub og skeleton udfra server implementations class fil:


  rmic CalcImpl



Starte RMIRegistry:


  rmiregistry



Starte server:


  java CalcImpl



Starte client:


  java TestCalc



RMIRegistry skal have stub i classpath.

Server skal have interface + implementation + skeleton i classpath.

Client skal have stub i classpath.

Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
12 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Gør dig selv en tjeneste: Køb et ordentligt SD-kort

Der kan være meget stor hastighedsforskel på to umiddelbare ens SD-kort. Se her hvad du skal være opmærksom på, når du køber ekstra hukommelse til din mobil, tablet eller kamera.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Gratis flysimulator fra Microsoft

Den legendariske Flight Simulator fra Microsoft genopstår den 29. februar - og denne gang er spillet gratis.


Nyheder fra Computerworld

Teaser billede

Bank: Derfor er login uden NemID helt i orden

Der er ikke hold i påstanden om sikkerhedsproblemer i forbindelse med bankkunders login uden brug af NemID, lyder det fra Nykredit Bank.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger