0% found this document useful (0 votes)
13 views28 pages

L6-RMIProgramming

The document provides an overview of Java Remote Method Invocation (RMI), detailing its architecture, programming components, and a sample application. It explains the steps to implement an RMI application, including defining interfaces, creating server and client components, and handling security and exceptions. Additionally, it discusses advanced concepts such as dynamic class loading and provides a file server scenario as an example of RMI in practice.

Uploaded by

ang.jeevan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13 views28 pages

L6-RMIProgramming

The document provides an overview of Java Remote Method Invocation (RMI), detailing its architecture, programming components, and a sample application. It explains the steps to implement an RMI application, including defining interfaces, creating server and client components, and handling security and exceptions. Additionally, it discusses advanced concepts such as dynamic class loading and provides a file server scenario as an example of RMI in practice.

Uploaded by

ang.jeevan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 28

Distributed Objects and Remote

Invocation: RMI & CORBA

http://java.sun.com/docs/books/tutorial/rmi/
Outline

 Introduction to RMI
 RMI Architecture
 RMI Programming and a Sample Example:
 Server-Side RMI programming
 Client-Side RMI programming
 Advanced RMI Concepts
 Security Policies
 Exceptions
 Dynamic Loading
 A more advanced RMI application
 File Server

2
What is Java RMI?

 Java Remote Method Invocation (Java RMI) enables


the programmer to create distributed Java
technology-based applications, in which the methods
of remote Java objects can be invoked from other
Java virtual machines*, possibly on different hosts.
 RMI uses object serialization to marshal and
unmarshal parameters and does not truncate types,
supporting true object-oriented polymorphism.
 Releases of Java RMI
 Java RMI is available for Java Standard Edition (JSE) and
Java Micro Edition (JME).

3
RMI Architecture & Components
 Remote reference module is responsible for providing addressing to the
proxy (stub) object
 Proxy is used to implement a stub and provide transparency to the client. It is
invoked directly by the client (as if the proxy itself was the remote object),
and then marshal the invocation into a request
 Communication module is responsible for networking
 Dispatcher selects the proper skeleton and forward message to it
 Skeleton un-marshals the request and calls the remote object

client server
remote
skeleton object B
object Aproxy for B Request & dispatcher
for B’s class

Reply

servant
Remote Communication CommunicationRemote reference
4 module module module
reference module
Invocation Lifecycle

Client Server

Client Code RMI Object


Invoke Returns Calls actual Returns
method via
stub 1 8 response method
with args 4 5
response /
exception

Stub Skeleton
Serializes Receives, Receives, Serialises
arguments, deserialises deserialises response,
transmit
2 7
response arguments
3 6 transmit

Network
5
Steps of implementing an RMI application

 Design and implement the components of your


distributed application

Remote interface

Servant program

Server program

Client program
 Compile source and generate stubs

Client proxy stub

Server dispatcher and skeleton
 Make classes network accessible

Distribute the application on server side
 Start the application

6
RMI Programming and Examples

 Application Design

Remote Interface
 Exposes the set of methods and properties available
 Defines the contract between the client and the server
 Constitutes the root for both stub and skeleton

Servant component
 Represents the remote object (skeleton)
 Implements the remote interface

Server component
 Main driver that makes available the servant
 It usually registers with the naming service

Client component

7
Example application – Hello World

 Server side
 Create a HelloWorld interface
 Implement HelloWorld interface with methods
 Create a main method to register the HelloWorld
service in the RMI Name Registry
 Generate Stubs and Start RMI registry
 Start Server
 Client side
 Write a simple Client with main to lookup
HelloWorld Service and invoke the methods

8
Explanation: Server Side

 Restrictions on the Remote interface


 User defined interface must extend java.rmi.Remote interface
 Methods inside the remote interface must throw java.rmi.RemoteException
 Servant class is recommended to extend java.rmi.server.UnicastRemoteObject
 Servant that does not extend UnicastRemoteObject need to export explicitly

UnicastRemoteObject.export(Remote remoteObj);
 Name Service: RMI Registry
 Bind, unbind and rebind remote object to specified name
 All the classes required need to be on rmiregistry classpath
 java.rmi.Naming is an interface for binding object name (URL) to the registry
 Format of object URL
 //host:port/objectname (implicit declaration of RMI protocol for name)

Eg. //localhost/HelloWorldService or rmi://localhost/HelloWorldService
 Default port is 1099
 For security reason, a server program can bind, unbind and rebind only on its same host
 Prevent any binding from the remote clients
 Lookup can be invoked everywhere
 After the binding, the remote object will not be reclaimed in garbage collection until the
server unbinds it
 Because it is remotely referred by the registry (running in a separate JVM)

9
Server Side : Define an interface
(cs652/HelloWorld.java)

package cs652;

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

public interface HelloWorld extends Remote {


public String sayHello(String who) throws
RemoteException;
}

10
Implementing a remote
interface(cs652/HelloWorldImpl.java)
package cs652;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloWorldImpl extends UnicastRemoteObject implements HelloWorld {
public HelloWorldImpl() throws RemoteException {
super();
}
public String sayHello(String who) throws RemoteException {
return "Hello "+who+" from your friend RMI 433-652 :-)";
}
public static void main(String[] args) {
String hostName = "localhost";
String serviceName = "HelloWorldService";
if(args.length == 2){
hostName = args[0];
serviceName = args[1];
}
try{
HelloWorld hello = new HelloWorldImpl();
Naming.rebind("rmi://"+hostName+"/"+serviceName, hello);
System.out.println("HelloWorld RMI Server is running...");
}catch(Exception e){}
}
}11
Generate Stubs and Start RMI registry

 Compile

javac cs652/HelloWorld.java

javac cs652/HelloWorldImpl.java
 Generate Stubs

rmic cs652.HelloWorldImpl
 Start RMI registry

start rmiregistry (windows)

rmiregistry 10000 & (unix)
 Start HelloWorld Server

java cs652.HelloWorldImpl

java cs652.HelloWorldImpl localhost:10000
HelloWorldService

12
Explanation: Client Side

RMI Registry RMI Service

Get
Lookup Service
Service Reference

Client
Invoke RMI Remote Object
Service

 Look up the server registry


 Based on the targeting object URL
 Get the remote object reference from the Registry
 Invoke the methods on the remote object reference

13
Client Side : A Simple Client
(cs652/RMIClient.java)

package cs652;
import java.rmi.Naming;
public class RMIClient {
public static void main(String[] args) {
String hostName = "localhost";
String serviceName = "HelloWorldService";
String who = "Raj";
if(args.length == 3){
hostName = args[0];
serviceName = args[1];
who = args[2];
}else if(args.length == 1){
who = args[0];
}
try{
HelloWorld hello = (HelloWorld)Naming.lookup("rmi://"+hostName+"/"+serviceName);
System.out.println(hello.sayHello(who));
}catch(Exception e){
e.printStackTrace();
}
}
}

14
Compile and Run

 Compile
 javac cs652/RMIClient.java
 Run it
 java cs652.RMIClient
 java cs652.RMIClient localhost HelloWorldService
Raj
 java cs652.RMIClient manjra.cs.mu.oz.au:10000
HelloWorldService Raj

15
Security Manager

 Java’s security framework


 java.security.-

 Permissions, Principle, Domain etc.

 Security manager, for access control (file, socket, class load,

remote code etc)


 $JAVA_HOME/jre/lib/security/java.policy

 Use security manager in RMI


 RMI recommends to install a security manager, or RMI may not

work properly while encountering security constraints.


 A security manager ensures that the operations performed by

downloaded code go through a set of security checks.



Eg. Connect and accept ports for RMI socket and allowing code
downloading

16
Security Manager (cont.)

 Two ways to declare security manager


 Use System property java.security.manager
java –Djava.security.manager cs652.HelloWorldImpl
 Explicit declare in the source code
public static void main(String[]args){
//check current security manager
if(System.getSecurityManager()==null){
System.setSecurityManager(new RMISecurityManager());
}

//lookup remote object and invoke methods.
}
 Use customized policy file instead of java.policy
 Usage
java -Djava.security.manager -Djava.security.policy=local.policy
cs652.HelloWorldImpl

17
File: “local.policy” contents

Specific permissions:

grant {
permission java.net.SocketPermission "*:1024-65535","connect,accept";
permission java.io.FilePermission "/home/globus/RMITutorial/-", "read";
};

Grant all permissions:


grant {
permission java.security.AllPermission;
};

18
Exceptions

 The only exception that could be thrown out is


RemoteException
 All RMI remote methods have to throw this exception
 The embedded exceptions could be:
 java.net.UnknownHostException or
java.net.ConnectException: if the client can’t connect to the
server using the given hostname. Server may not be running
at the moment
 java.rmi.UnmarshalException: if some classes not found.
This may because the codebase has not been properly set
 Java.security.AccessControlException: if the security policy
file java.policy has not been properly configured

19
Passing objects

 Restrictions on exchanging objects


 Implementing java.io.serializable
 All the fields in a serializable object must be also
serializable
 Primitives are serializable
 System related features (e.g. Thread, File) are non-
serializable
 How about the socket programming issues?
 Where are sockets and corresponding input, output
streams?
 How to handle object passing?
 Who does all the magic?

20
RMI Dynamic Class Loading

 Ability to download bytecode (classes) from


Remote JVM
 New types can be introduced into a remote
virtual machine without informing the client
 Extend the behavior of an application dynamically
 Removes the need to deploy stubs manually
 Explicit set property to support dynamic class
load
 Specify system property java.rmi.server.codebase
to tell the program where to download classes

21
Sample scenario : File Server

Unix File Server

Windows File Server

Mac File Server


User
File Server Scenario

 Basic Requirements ( File Server )



Get the files from the File Server on specific directory

Create new files on the File Server

Create new directories on the File Server

Delete files or directory on the File Server
 Client

A File Browser to explore the file system on the File Server
supporting view, create and delete functionalities.
22
Programming File Server
 Create RMI remote interface
public interface FileServer extends Remote {
public Map getFiles(String baseDir) throws RemoteException;
public Map getFiles(String baseDir,boolean upper) throws RemoteException;
public void createFile(String filename,boolean isDir) throws RemoteException;
public void deleteFile(String filename) throws RemoteException;
}
 Implement the Servant

FileServerImpl.java [FileServerImpl implements FileServer]
 Implement the Server
public class RMIFileServer{
public static void main(String [] args){
try{
String host = "localhost";
if(args.length == 1){
host = args[0];
}
Naming.rebind("//"+host+"/FileServer",new FileServerImpl());
}catch(Exception e){}
}
}
 Generate Stub

rmic –keep cs652.rmi.server.FileServerImpl (keep option is to keep the generated java file)

23
Programming File Browser

 Create a Subclass of JFrame


 RMIFileBrowser.java

 Locate the FileServer Object


private FileServer findFileServer(String serviceURI)throws Exception{
return (FileServer)Naming.lookup("rmi://"+serviceURI);
}
 Invoke the appropriate methods
Get Files : Map result = getFileServer().getFiles(dir,upper);
Create File: getFileServer().createFile(absoluteFilePath,false/*isDir=false*/);
Create Dir: getFileServer().createFile(absoluteFilePath,true/*isDir=true*/);
Delete File: getFileServer().deleteFile(absoluteFilePath);
 Write a local policy file
Grant{
java.security.AllPermission;
};

24
Run it!

 Two steps
 Start the server


start rmiregistry (be aware of your classpath)

java cs652.rmi.server.RMIFileServer
 Start the client

java -Djava.security.manager -Djava.security.policy=local.policy
cs652.demo.RMIFileBrowser
Note: Required classes including the generated stubs must be visible
by java classloader.

25
Potential error - no security manager!

26
Successful execution

27
Summary: RMI Programming

 RMI greatly simplifies creation of distributed


applications (e.g., compare RMI code with socket-
based apps)
 Server Side

Define interface that extend java.rmi.Remote

Servant class both implements the interface and extends
java.rmi.server.UnicastRemoteObject

Register the remote object into RMI registry

Ensure both rmiregistry and the server is running
 Client Side

No restriction on client implementation, both thin and rich
client can be used. (Console, Swing, or Web client such as
servlet and JSP)

28

You might also like