Lektion 5 3D

Download Report

Transcript Lektion 5 3D

15 - RMI
Java RMI
Architecture
Example
Deployment
RMI is a part of J2SE (standard edition), but is used by J2EE)
A J2EE server is not nessesary for using RMI
Communikation between different machines
• Sockets, RPC and RMI
– For sockets a common protocol on application level is
needed to encode and decode sent and received messages
– RPC (Remote Procedure Call) pulls the abstraction level for
communication up ti procedural level
– RMI (Remote Method Invocation) handles communication
between objects in different adress spaces.
NOEA
Java-kursus – RMI
2009
3
Distributed Object-application (DOA)
• A application, where the server provides remote objects on
which methods might be activated from different clients, is
called a hvis metoder kan kaldes fra forskellige klienter
”distributed object-application”
• DOA needs to:
– Localize remote objects
– Communicate with remote objects
– Handle byte code for objects that are send as a parameter or
a return value
• RMI can handle this
NOEA
Java-kursus – RMI
2009
4
Architecture
NOEA
Java-kursus – RMI
2009
5
Example for building a RMI-application
• The steps:
1. Contruct an interface (remote)
2. Implement the interface
3. Create a server class
4. Create a client class
5. Compile it (javac og rmic)
6. Run the application
start rmi-registry (not nessesary from java 1.5), server and
klient
NOEA
Java-kursus – RMI
2009
6
Oprettelse af interface
import java.rmi.*;
public interface Hello extends Remote
{
public String getGreeting() throws RemoteException;
}
• Java.rmi.Remote is a interface that all RMI-application must
inherit from
• Java.rmi.RemoteException is the superclass for exceptions
that RMI can throw and shall always be handled
NOEA
Java-kursus – RMI
2009
7
Implementation af interfacet
import java.rmi.*;
import java.rmi.server.*;
public class HelloImpl extends UnicastRemoteObject implements Hello{
public HelloImpl() throws RemoteException
{
//Default constructor is implemented because of RemoteException
}
public String getGreeting() throws RemoteException
{
return ("Hello there!");
}
}
NOEA
Java-kursus – RMI
2009
8
Server class
//Server.
import java.rmi.*;
public class HelloServer{
private static final String HOST = "localhost";
public static void main(String[] args) throws Exception{
HelloImpl temp = new HelloImpl();
String rmiObjectName = "rmi://" + HOST + "/Hello";
//Could omit host name, since 'localhost' would be
//assumed by default.
Naming.rebind(rmiObjectName,temp);
System.out.println("Binding complete...\n");
}
}
NOEA
Java-kursus – RMI
2009
9
Client class
import java.rmi.*;
public class HelloClient{
private static final String HOST = "localhost";
public static void main(String[] args){
try{
Hello greeting = (Hello)Naming.lookup("rmi://" +
HOST + "/Hello");
System.out.println("Message received: " +
greeting.getGreeting());
}
catch(ConnectException conEx){
System.out.println("Unable to connect to server!");
}
catch(Exception e){
e.printStackTrace();
}
}
}
NOEA
Java-kursus – RMI
2009
10
Generate the stub
• We still missing the piece of code that handles the
communication.
• It is placed in the file HelloImpl_Stub
The file is generated by running rmic.exe på impl-filen:
rmic –v1.2 HelloImpl
From JDK 1.5 this is done automaticly
NOEA
Java-kursus – RMI
2009
11
How does it function? - Deployment
• To make the client run: the HelloClient, Hello and
HelloImpl_stub
must be present on the client
• HelloServer, Hello, HelloImpl and HelloImpl_stub must be
present on the server
• The stub is a proxy class for the remote-object. The stub
takes care of the communication between the client and the
server by marshalling/unmarshalling
• The client knows how to manipulate the server object
because yhe server object implements the interface that is
also known on the client
NOEA
Java-kursus – RMI
2009
12
RMIRegistry
• Rmiregistry is a program that handles the nameservice.
• Registry shall be started before the server is started
(This is done automatically in jdk1.5+)
• The rebind-method of the server binds a name (URL) to the
implementation object on the server.
• The client can use the lookup method to get a reference to
the impl-object
• Add your server files to classpath in order for rmiregistry to
find them.
• Rmiregistry is started from the command promt by:
start rmiregistry
NOEA
Java-kursus – RMI
2009
13
Call semantics
• When a method is called on a remote object, there is two ways
of passing the parameters dependent of whether the parameter
(and the return value) is a remote object or not.
• If remote then is call-by-reference
• If not then it is call-by-value (copy)
• Objects that are sent by copy shall implement the interface
Serializable
NOEA
Java-kursus – RMI
2009
14