0% found this document useful (0 votes)
56 views38 pages

Java RMI CDP Tutorial: Based On

RMI allows Java objects to run remotely by making remote method calls appear as local method calls. The client holds a stub that communicates with a skeleton on the server, which invokes methods on the actual remote object. Objects are registered with and looked up from a registry. Parameters are passed by value for primitives and by reference for remote objects.

Uploaded by

Abhinav Sharma
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
56 views38 pages

Java RMI CDP Tutorial: Based On

RMI allows Java objects to run remotely by making remote method calls appear as local method calls. The client holds a stub that communicates with a skeleton on the server, which invokes methods on the actual remote object. Objects are registered with and looked up from a registry. Parameters are passed by value for primitives and by reference for remote objects.

Uploaded by

Abhinav Sharma
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 38

Java

RMI
CDP Tutorial

Based on

Based on the slides of Alexander Day Chaffee


Remote Objects (Diagram)
Java Virtual Machine Java Virtual Machine

Client Remote
Object TCP Object
What is RMI?

RMI is an RPC system for an object based
language.

Objects provide a natural granularity for the
binding of functions.

RMI allows a program to hold a reference to an object
on a remote system and to call that object’s methods.

Client-Server architecture.

Server holds the object.

Client holds a small stub that accesses the object on
the Server.
RMI Layers
Java Virtual Machine Java Virtual Machine
Client Remote
Object Object

Stub Skeleton

Remote Reference Layer Remote Reference Layer


TCP
Transport Layer Transport Layer
Remote Objects

Remote Objects

Live on server

Accessed as if they were local
Remote References and
Interfaces

Remote References

Refer to remote objects

Invoked on client exactly like local object
references

Remote Interfaces

Declare exposed methods

Implemented on client

Like a proxy for the remote object
Stubs and Skeletons

Stub

lives on client

pretends to be remote object

Skeleton

lives on server

receives requests from stub

talks to true remote object

delivers response to stub
Remote Interfaces and Stubs
Remote Interface

implements implements

Remote Object
Client Stub Skeleton
(Server)
Registries

Name and look up remote objects

Servers can register their objects

Clients can find server objects and obtain a
remote reference

A registry is a running process on a host
machine
RMI System Architecture
Client Virtual Machine Server Virtual Machine
Client Remote
Object

Skeleton
Stub Server

“Fred”

Registry Virtual Machine


RMI Flow
1. Server Creates Remote Object
Client Virtual Machine Server Virtual Machine
2. Server Registers Remote Object
Client Remote
Object
1

Skeleton
Stub Server

“Fred”

Registry Virtual Machine


RMI Flow
Client Virtual Machine Server Virtual Machine
Client Remote
3. Client requests object from Registry
Object
4. Registry returns remote reference
(and stub gets created)
Skeleton
Stub Server
3 4

“Fred”

Registry Virtual Machine


RMI Flow
Client Virtual Machine Server Virtual Machine
Client Remote
Object
5 7

6
Skeleton
Stub Server

5. Client invokes stub method


6. Stub talks to skeleton
7. Skeleton invokes remote object
method “Fred”

Registry Virtual Machine


RMI Usage

Start registry

Start server

Run client
Creating Remote Objects

Define a Remote Interface

extends java.rmi.Remote

Define a class that implements the Remote
Interface

extends java.rmi.RemoteObject

or java.rmi.UnicastRemoteObject
Remote Interface Example
import java.rmi.*;
public interface Adder
extends Remote
{
public int add(int x, int y)
throws RemoteException;
}
Remote Class Example
import java.rmi.*;
import java.rmi.server.*;
public class AdderImpl extends UnicastRemoteObject
implements Adder
{
public AdderImpl() throws RemoteException
{
// NOTE: !!!EMPTY CONSTRUCTOR!!!
}
public int add(int x, int y) throws RemoteException
{
return x + y;
}
}
Registering Remote Classes

start the registry

running process

Unix:
rmiregistry &

Windows:
start /m rmiregistry
Registry CLASSPATH

Registry VM needs to be able to find stub
file(s)

You must set the CLASSPATH to include
the directory containing the stub file

An easy way to check CLASSPATH is to use the javap command,
supplying a fully package qualified class name. It uses the current
CLASSPATH to find and print the interface to a class.
Create the server

Creates a new instance of the remote
object

Registers it in the registry with a unique
name

That’s it
RMI Server Example
try {
AdderImpl adder = new AdderImpl();
Naming.rebind("adder", adder);
System.err.println(“Bind successful”);
}
catch (RemoteException re) {
re.printStackTrace();
}
catch (MalformedURLException me) {
me.printStackTrace();
}
Launch the Server
% java AdderServer
Bind successful
Server Logging

invoke from command line
java
-Djava.rmi.server.logCalls=true
YourServerImpl

or enable inside program
RemoteServer.setLog(System.err);
Creating an RMI Client

Find a registry

use java.rmi.Naming

Lookup the name, returns a reference

Cast the reference to the appropriate
Remote Interface

Just use it!
RMI URLs
rmi://host[:port]/name

default port is 1099

Specifies hostname of registry

can also use relative URLs

name only

assumes registry is on local host
RMI Client Example
Adder a = (Adder)//not AdderImpl
Naming.lookup("rmi://server/adder");

int sum = a.add(2,2);


System.out.println("2+2=" + sum);
Remote Interfaces vs. Remote
Classes

Remember that the reference is to an
interface

You must make references, arrays, etc. out
of the interface type, not the
implementation type

You can’t cast the remote reference to a
normal reference

So name your Remote Objects with “Impl”
(so you don’t get confused)
Parameter Passing

Primitive types

passed by value

Remote objects

passed by reference

Non-remote objects

passed by value

uses Java Object Serialization
Callbacks

They just work

Pass in a remote reference to a client
object

Server object can call its methods
transparently

Registry is out of the loop
Object Serialization

aka Persistence

saves the state (data) of a particular
instance of an object

serialize - to save

unserialize - to load
Java Serialization

writes object as a sequence of bytes

writes it to a Stream

recreates it on the other end

creates a brand new object with the old
data
java.io.Serializable

Objects that implement the
java.io.Serializable interface are marked as
serializable

Also subclasses

Magically, all non-static and non-transient
data members will be serialized

Actually, it’s not magic, it’s Reflection (it’s
done with mirrors)

empty interface - just a marker

It’s a promise
Not All Objects Are
Serializable

Any object that doesn’t implement
Serializable

Any object that would pose a security risk

e.g. FileInputStream

Any object whose value depends on VM-
specific information

e.g. Thread

Any object that contains a (non-static, non-
transient) unserializable object (recursively)
NotSerializableException

thrown if you try to serialize or unserialize
an unserializable object

maybe you subclassed a Serializable object
and added some unserializable members
Incompatible Changes

If class has members added or removed, it
becomes incompatible

java.io.InvalidClassException thrown if you
try to deserialize an incompatible object
stream
Limitations of RMI

Java-only

but you can use JNI on the server

Uses TCP, not UDP

At least two sockets per connection

Untested for huge loads
Summary

RMI is a very clean API

Easy way to write distributed programs

Wire protocol may need improvement for
large-scale problems
Where to get more
information

Harold, Java Network Programming
(O’Reilly)

rmi-users mailing list ([email protected])

http:/ / www.developer.com/ (Gamelan)

http:/ / www.javaworld.com/ (magazine)

http:/ / www.stinky.com/ java/ (Alexander
Day Chaffee's site)

Material from the previous semester

You might also like