Содержание

Слайд 2

Remote Method Invocation Client Server Client Remote Object Interface Stub Skeleton

Remote Method Invocation

Client

Server

Client

Remote Object Interface

Stub

Skeleton

Remote Object Interface

Remote Object
Implementation

You implement this

RMI implements

this
Слайд 3

Interfaces (Transparency) To client, remote object looks exactly like a local

Interfaces (Transparency)

To client, remote object looks exactly like a local object

(except that you must bind to it first).
Using interfaces:
you write interface for remote object
you write implementation for remote object
RMI creates stub class (implementing the remote object interface)
client accesses stub exactly same way it would access a local copy of the remote object
Слайд 4

RMI Registry RMI needs a port mapper too: servers can register

RMI Registry

RMI needs a port mapper too:
servers can register contact address

information
clients can locate servers
Called RMI registry
You must start it yourself (unlike RPC):
needs to be started on every machine that hosts server objects
program called rmiregistry
runs on port 1099 by default (but you can use ‘rmiregistry ’)
Programs can access the registry thanks to java.rmi.Naming class.
Слайд 5

Example Simple program: write interface for remote object: Remote.java implementation of

Example

Simple program:
write interface for remote object: Remote.java
implementation of object: RemoteImpl.java
server to

run object: RemoteServer.java
client to access object: Client.java
RMI compiler ‘rmic’ generates:
client stub: RemoteImpl_Stub.class (already compiled)
server skeleton: RemoteImpl_Skel.class (already compiled)
Слайд 6

Example Step 1: write interface Calculator.java import java.rmi.Remote; import java.rmi.RemoteException; public

Example

Step 1: write interface Calculator.java
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Calculator extends Remote

{
public long add(long a, long b) throws RemoteException;
public long sub(long a, long b) throws RemoteException;
public long mul(long a, long b) throws RemoteException;
public long div(long a, long b) throws RemoteException;
}
Few rules:
interface must extend java.rmi.Remote interface
methods must throw java.rmi.RemoteException exception
Compile:
$ javac Calculator.java
Слайд 7

Example Step 2: write remote object CalculatorImpl.java import java.rmi.server.UnicastRemoteObject; import java.rmi.RemoteException;

Example

Step 2: write remote object CalculatorImpl.java
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class CalculatorImpl extends

UnicastRemoteObject
implements Calculator {
// Implementations must have an explicit constructor
public CalculatorImpl() throws RemoteException {
super();
}
public long add(long a, long b) throws RemoteException {
return a + b;
}
public long sub(long a, long b) throws RemoteException {
return a - b;
}
public long mul(long a, long b) throws RemoteException {
return a * b;
}
public long div(long a, long b) throws RemoteException {
return a / b;
}
}
Слайд 8

Example Implementation class must respect a few constraints: must implement the

Example

Implementation class must respect a few constraints:
must implement the interface (of

course)
must inherit from the java.rmi.server.UnicastRemoteObject class
must have explicit constructor which throws the java.rmi.RemoteException exception
Compile:
$ javac CalculatorImpl.java
Слайд 9

Example Step 3: generate stub and skeleton RMI compiler: $ rmic

Example

Step 3: generate stub and skeleton
RMI compiler:
$ rmic CalculatorImpl
Generates CalculatorImpl_Stub.class and

CalculatorImpl_Skel.class files.
Already compiled.
Слайд 10

Example Step 4: write server CalculatorServer.java import java.rmi.Naming; public class CalculatorServer

Example

Step 4: write server CalculatorServer.java
import java.rmi.Naming;
public class CalculatorServer {
public CalculatorServer() {
try

{
Calculator c = new CalculatorImpl();
Naming.rebind(“rmi://localhost:1099/CalculatorService”, c);
} catch (Exception e) {
System.out.println(“Trouble: “ + e);
}
}
public static void main(String args[]) {
new CalculatorServer();
}
}
Слайд 11

Example Server program creates CalculatorImpl object. Registers object to local RMI

Example

Server program creates CalculatorImpl object.
Registers object to local RMI registry (‘rebind()’):
rebind(String

name, Remote obj) associates a name to an object
names are in the form of a URL:
rmi://[:port]/
Server waits for incoming requests
$ javac CalculatorServer.java
Слайд 12

Example Step 5: write CalculatorClient.java import java.net.MalformedURLException; public class CalculatorClient {

Example

Step 5: write CalculatorClient.java
import java.net.MalformedURLException;
public class CalculatorClient {
public static void main(String[]

args) {
try {
Calculator c = (Calculator)
Naming.lookup(“rmi://wizard.cse.nd.edu/CalculatorService”);
System.out.println(c.add(4,5));
System.out.println(c.sub(4,3));
}
catch (Exception e) {
System.out.println(“Received Exception:”);
System.out.println(e);
}
}
}
Слайд 13

Example Before invoking the server, the client must ‘lookup’ the registry:

Example

Before invoking the server, the client must ‘lookup’ the registry:
must provide

the URL for remote service
gets back a stub which has exactly the same interface as the server
can use it as a local object: long x = c.add(4,5);
Compile:
$ javac CalculatorClient.java
Слайд 14

Example Step 6: test it! Start the RMI registry: rmiregistry registry

Example

Step 6: test it!
Start the RMI registry: rmiregistry
registry must have access

to your classes
either start the registry in the same directory as the classes or make sure directory is listed in $CLASSPATH variable
Start server: java CalculatorServer
Start client:
$ java CalculatorClient
9
1
$
Слайд 15

Using RMI in a Distributed Context First, test your program on

Using RMI in a Distributed Context

First, test your program on a

single host.
To use it on 2 machines:
server and rmiregistry need the following files:
Calculator.class (server object interface)
CalculatorImpl.class (server object implementation)
CalculatorImpl_Stub.class (stub)
CalculatorServer.class (server program)
client needs:
Calculator.class (server object interface)
CalculatorImpl_Stub.class (stub)
CalculatorClient.class (client program)
nobody needs the skeleton file CalculatorImpl_Skel.class
generated only for compatibility with JDK-1.1