- Internetprogrammering 98/99 -

RMI: Transport av seriealiserat objekt från klient till server

Nu följer ett litet exempel på hur vi kan konstruera en klass och ett objekt på klientsidan och skicka det till en server för exekvering.

Konstruktion av interface

Vi börjar med dom två interfacen, ett för objektet som vars referens skall kunna distribueras (dvs serverns distribuerade objekt) och ett för objektet som skall kunna tranporteras till en annan platform för exekvering. Jämför gärna med tutorialen.
Först definierar vi gränssnittet för vad som skall implementeras av servern och anropas av klienter. Vi har (kokboksmässigt) utvidgat interfacet Remote och deklarerat att alla metoder som skall kunna anropas över nätverket kan "kasta" java.rmi.RemoteException.
import java.rmi.*;

interface HelloWithTransport extends Remote {
    public void sayHelloVia(HelloTransportInterface transportObject)
            throws java.rmi.RemoteException;
}

Sedan deklarerar vi interfacet för det objekt som skall kunna transporteras från klient till server. Då detta objekt måste vara seriealiserbart så utvidgar vi Serializable.
import java.io.Serializable;

interface HelloTransportInterface extends Serializable {
    public void say(String saying);
}

Konstruktion av Server

Servern skriver vi utan kommentarer.
import java.rmi.*;
import java.rmi.server.*;

public class HelloServerTransport extends UnicastRemoteObject implements HelloWithTransport {
 public HelloServerTransport() throws RemoteException
 {
  super();
 }

 public void sayHelloVia(HelloTransportInterface transportObject) throws RemoteException {

  transportObject.say("Hello Internetprogrammers (via transport)!");
 }

 public static void main(String [] args) {
  // System.setSecurityManager(new RMISecurityManager());
  try {
   HelloServerTransport h = new HelloServerTransport();
   Naming.rebind("hellowithtransport", h);
   System.out.println("Hello with Callback Server ready.");
  }
  catch(RemoteException re) {
   System.out.println("RemoteException in HelloServerTransport.main: " + re);
  }
  catch(Exception e) {
   System.out.println("Exception in HelloServerTransport.main: " + e);
  }
 }
}

Klient

Klienten kommer också okommenterad.
import java.rmi.*;
import java.io.*;

public class HelloClientWithTransport {
 public static class MyTransportObject implements HelloTransportInterface {
  public void say(String saying){
   System.out.println("From the client: " + saying);
  }
 }

 public static void main(String [] args) {
  System.out.println("Client started");
  // System.setSecurityManager(new RMISecurityManager());
  try {
   HelloWithTransport h = (HelloWithTransport) Naming.lookup("hellowithtransport");

   //Transportera koden för ett objekt och exekvera hos servern.
   MyTransportObject transport = new MyTransportObject ();
   h.sayHelloVia(transport);
  }
  catch(Exception e) {
   System.out.println("Exception in HelloClientWithTransport .main: " + e);
  }
 }
}

Kompilera

  1. Kompilera båda interfacen, servern och klienten med javac, dvs

  2. >javac HelloWithTransport.java
    >javac HelloTransportInterface.java
    >javac HelloServerTransport.java
    >javac HelloClientWithTransport.java
  3. Kör också rmic på servern, dvs

  4. >rmic HelloServerTransport

Testkörning

Vi kör exemplet på följande sätt (svar i kursivt):
  1. Starta namnserver

  2. >rmiregistry
  3. Starta server

  4. >java HelloServerTransport
    Hello with Callback Server ready.
  5. Starta klient

  6. >java HelloClientWithTransport
    Client started
    Iockmed att klienten startas kommer också följande skrivas på severns terminal:
    From the client: Hello Internetprogrammers (via transport)!


^ Upp till kursens hemsida.


Sidansvarig: <bjorne@nada.kth.se>
Senast ändrad 21 april 1999