Title: Advanced Remote Method Invocations
1Advanced Remote Method Invocations
2RMI Advanced topics
- The Java RMI API has a rich collection of
features. - We will look at some of RMIs more interesting
advanced features, namely - stub downloading
- security manager
- client callback.
- Although these features are not inherent to the
distributed object paradigm, they are helpful
mechanisms and can be useful to application
developers.
3The Java RMI Architecture
4Java RMI Client Server Interaction
5RMI Stub Downloading
- RMI is designed to allow stubs to be made
available to the client dynamically (in HW_3).
Doing so allows changes to be made in the remote
methods without affecting the client program. - The stub can be filed with an web server and be
downloaded using HTTP/FTP. - Security measures are needed in both the client
side and the server side - A java security policy file needs to be set on
the server host and also on the client host. - A Java Security Manager should be instantiated in
both the client and server programs.
6Stub downloading
- If the stub will be downloaded from a remote
server, transfer the stub class to the
appropriate directory that HTTP server can reach,
e.g., www.csc.calpoly.edu/mliu/www, and make
sure that the RIGHT access permission to the file
is set. - When activating the server, specify command option
java -D java.rmi.server.codebase ltURLgt
\ -D java.rmi.server.hostnameltserver host namegt
\ -D java.security.policyltfull directory path
to java.policy filegt
7The java.policy file
- The RMI security manager does not permit network
access. Exceptions can be made via the
specification in a java.policy file. - grant
- // permits socket access to all common TCP
ports, including the default - // RMI registry port (1099) need for both
the client and the server. - permission java.net.SocketPermission
"1024-65535", "connect,accept,resolve" -
- // permits socket access to port 80, the
default HTTP port needed - // by client to contact an HTTP server for
stub downloading - permission java.net.SocketPermission "80",
"connect" -
- grant // Allow everything hw_3
- permission java.security.AllPermission
-
8The java.policy file - 2
- This file can be filed in the same directory as
the server class file. - When activating the client, a java.policy file
also should be specified - java -D java.rmi.server.useCodebaseOnlytrue
- -D java.rmi.server.codebase
http//hostname80/stub_dir/ - -D java.security.manager -D
java.security.policyjava.policy - SomeClient
- -D propertyvalue -Djava.security.policys
omeURL SomeApp - where someURL is a URL specifying the location
of a policy file - java.rmi.server.codebase this property specifies
the locations from which classes that are
published by this JVM. - java.rmi.server.useCodebaseOnly If this value is
true, automatic loading of classes is prohibited
except from the local CLASSPATH and from the
java.rmi.server.codebase property set on this
JVM. - Default security policy file java_jre_home/lib/s
ecurity/java.policy - permission java.net.SocketPermission
"localhost1024-", "listen"
9The java.policy file - 3
- The "-D java.security.manager" argument ensures
that the default security manager is installed,
and thus the application is subject to policy
checks. - Default security manager is not required if the
application installs a security manager. -
- If you use java -Djava.security.manager D
java.security.policysomeURL SomeApp, then just
the specified policy file will be used all the
ones indicated in the security properties file
will be ignored.
Ref http//java.sun.com/j2se/1.4.2/docs/guide/sec
urity/PolicyFiles.html
10File Placements
11RMI Security Manager
- Since RMI involves access to/from a
remote/foreign host, and possibly object
downloading, it is important for both the server
and the client to protect its system from
malicious access. - The RMISecurityManager--a Java class, can be
instantiated in both the client and the server
for limiting access privileges. - RMI's class loader will not download any classes
from remote locations if no security manager has
been set. - RMISecurityManager does not apply to applets,
which run under the protection of their browser's
security manager. - You can instantiate/write your own security
manager, if so desired. - try
- System.setSecurityManager(new
- RMISecurityManager( ))
- catch
12Sample Code for Stub Downloading
- The possible ways--accept, connect, listen, and
resolve, to connect to a host in SocketPermission
java class. - The "listen" action is only meaningful when used
with "localhost". - The "resolve" action is implied when any of the
other actions are present. The action "resolve"
refers to host/ip name service lookups. - p1 new SocketPermission(ise.gmu.edu7777",
"connect, accept") allows that code to connect
to port 7777 on ise.gmu.edu, and to accept
connections on that port. - p2 new SocketPermission("localhost1024-",
"accept, connect, listen") allows that code to
accept connections on, connect to, or listen on
any port between 1024 and 65535 on the local
host.
Ref http//java.sun.com/j2se/1.4.2/docs/api/java/
net/SocketPermission.html
13Algorithm for building an RMI Application
- Server side
- Open a directory for all the files to be
generated for this application. - Specify the remote-server interface, and compile
it to generate the interface class file. - Build the remote server class by implementing the
interface, and compile it using javac. - Use rmic to process the server class to generate
a stub.class file and a skelton.class file rmic
SomeServerImpl - If stub downloading is desired, copy the stub
file to an appropriate directory on the HTTP
host. - Activate the RMIRegistry, if it has not already
been activated. - Set up a java.policy file.
- Activate the server, specifying (i) the codebase
if stub downloading is desired, (ii) the server
host name, and (iii) the security policy file. - Â
14Sample Code for Stub Downloading
public interface HelloInterface extends Remote
public String sayHello() throws
java.rmi.RemoteException // end of
HelloInterface interface public class HelloImpl
extends UnicastRemoteObject implements
HelloInterface public HelloImpl() throws
RemoteException super( )
public String sayHello() throws RemoteException
return "Hello, World!" // end
HelloImpl class
15Sample Code for Stub Downloading
public class HelloServer public static void
main(String args) try
// System.setSecurityManager( new
RMISecurityManager())
startRegistry(RMIPortNum) HelloImpl
exportedObj new HelloImpl()
registryURL "rmi//cs1.cs.gmu.edu" portNum
"/hello" Naming.rebind(registryURL,
exportedObj) System.out.println("Hello
Server ready.") // end try catch
(Exception re) System.out.println("Exce
ption in HelloServer.main " re) // end
main
16Sample Code for Stub Downloading
grant // Allows RMI clients to make socket
connections to the // public ports on any
host. // If you start the RMI registry on a
port in this range, you // will not incur a
resolve access violation. permission
java.net.SocketPermission "1024-65535",
"connect, accept, resolve" // Permits
socket access to port 80, the default HTTP port
- // needed by client to contact an HTTP
server for stub // downloading. permission
java.net.SocketPermission "80", "connect,
accept, resolve"
17Sample Code for Stub Downloading
build (JAVAC) HelloInterface.java
(JAVAC) HelloServer.java (JAVAC)
HelloImpl.java rmic (RMIC)
HelloImpl runs (JAVA) -D
java.security.policyjava.policy
-D java.rmi.server.codebasehttp//server_URL
HelloServer
18Algorithm for building an RMI Application
- Client side
- Open a directory for all the files to be
generated for this application. - Implement the client program or applet, and
compile it to generate the client class. - If stub downloading is not in effect, copy the
server interface stub class file. - Set up a java.policy file.
- Activate the client, specifying (i) the server
host name, (ii) the security policy file, and
(iii) the codebase if stub downloading is
desired.
19Client Code for Stub Downloading - 1
public class HelloClient public static void
main(String args) try
System.setSecurityManager(new RMISecurityManager()
) String registryURL "rmi//ise.gmu.edu"
portNum "/hello" // find the remote
object and cast it to an interface object
HelloInterface h (HelloInterface)Naming.lookup(r
egistryURL) // invoke the remote method
String message h.sayHello() // end
try catch (Exception e)
System.out.println("Exception in HelloClient "
e) // end catch //end main //end class
20Client Code for Stub Downloading - 2
build (JAVAC) HelloClient.java
(JAVAC) HelloInterface.java runc
(JAVA) D java.rmi.server.useCodebaseOnlytrue
-D java.rmi.server.codebasehttp//URL_stub_
dir/ -D java.security.policyjava.policy
HelloClient
21RMI Callbacks
22Introduction
- In the client server model, the server is
passive the IPC is initiated by the client the
server waits for the arrival of requests and
provides responses. - Some applications require the server to initiate
communication upon certain events. Examples
applications are - monitoring
- games
- auctioning
- voting/polling
- chat-room
- message/bulletin board
- groupware
23Polling vs. Callback
- In the absence of callback, a client will have to
poll a passive server repeatedly if it needs to
be notified that an event has occurred at the
server end.
24Two-way communications
- Some applications require that both sides may
initiate IPC. - Using sockets, duplex communication can be
achieved by using two sockets on either side. - With connection-oriented sockets, each side acts
as both a client and a server.
Process 2
25RMI Callbacks
- A callback client registers itself with an RMI
server. - The server makes a callback to each registered
client upon the occurrence of a certain event.
26Callback Client-Server Interactions
27Callback application files
28RMI Callback file placements
29The Hello Application with Callback
30RMI Callback Interface
- The server provides a remote method (in server
interface), which allows a client to register
itself for callbacks. - A client remote interface for the callback is
needed, in addition to the server-side interface. - The client remote interface specifies a method
for accepting a callback from the server. - The client program is a subclass of RemoteObject,
and implements the callback (client) remote
interface, including the callback
methodNotifyMe(). - The client registers itself for callback in its
main method, by passing an object reference to
the client remote interface. - The server invokes the clients remote
methodNotifyMe(), upon the occurrence of the
anticipated event.
31Algorithm for building an RMI Callback Application
- Server side
- Open a directory for all the files to be
generated for this application. - Specify the remote-server interface, and compile
it to generate the interface class file. - Build the remote server class by implementing the
interface, and compile it using javac. - Use rmic to process the server class to generate
a stub class file and a skeleton class file
rmic ServerInterfaceImpl - If stub downloading is desired, copy the stub
file to an appropriate directory on the HTTP
host. - Activate the RMIRegistry, if it has not already
been activated. - Set up a java.policy file.
- Activate the server, specifying (i) the codebase
if stub downloading is desired, (ii) the server
host name, and (iii) the security policy file. - Obtain the CallbackClientInterface and its stub
file. Use rmic CallbackClientInterfaceImpl to
generate the stub file for the callback. - Â
32Remote Interface for Server
- public interface CallbackServerInterface extends
Remote - // remote method
- public String sayHello() throws
java.rmi.RemoteException -
- // method to be invoked by a client to add
itself to the callback list - public void registerForCallback (
- CallbackClientInterface CallbackObject)
- throws java.rmi.RemoteException
- public void unregisterForCallback(
- CallbackClientInterface CallbackObject)
- throws java.rmi.RemoteException
33Client Remote Interface for Callback
- // a remote interface specifying a callback
method - public interface CallbackClientInterface extends
java.rmi.Remote -
- // callback method to be called by the server
- public void NotifyMe ( String message )
- throws java.rmi.RemoteException
34ServerInterfaceImpl with callback
- public class CallbackServerInterfaceImpl extends
UnicastRemoteObject implements
CallbackServerInterface - public CallbackServerInterfaceImpl() throws
RemoteException - super( ) clientList new Vector()
- public String sayHello( ) throws
java.rmi.RemoteException - return("hello")
- public synchronized void registerForCallback(
CallbackClientInterface callbackClientObject)
throws java.rmi.RemoteException - if (!(clientList.contains(callbackClientObject)))
- clientList.addElement(callbackClientObject)
- doCallbacks()
- private synchronized void doCallbacks( ) throws
java.rmi.RemoteException - for (int i 0 i lt clientList.size() i)
- CallbackClientInterface nextClient
(CallbackClientInterface)clientList.elementAt(i) - String returnMsg nextClient.notifyMe("Num of
clients" clientList.size())
35ClientInterfaceImpl with callback
public class CallbackClientInterfaceImpl extends
UnicastRemoteObject implements CallbackClientInter
face public CallbackClientInterfaceImpl()
throws RemoteException super( )
public String notifyMe (String message)
String retMessage "Call back received "
message return retMessage
36Algorithm for building an RMI Callback Application
- Client side
- Open a directory for all the files to be
generated for this application. - Implement the client program or applet, and
compile it to generate the client class. - If stub downloading is not in effect, copy the
server interface stub class file by hand. - Implement the callback client interfaceclient
interface impl class - using rmic to generate a stub class and a
skeleton class for it for both client callback
interface and server interface. - Set up a java.policy file.
- Activate the client, specifying (i) the server
host name, (ii) the security policy file, and
(iii) the codebase if stub downloading is desired.
37CallbackClient
- public class CallbackClient
- public static void main(String args)
- try // stub downloading
- System.setSecurityManager(new
RMISecurityManager()) - String registryURL "rmi//cs1.cs.gmu.edu
" portNum "/callback" - CallbackServerInterface h (CallbackServerInterfa
ce)Naming.lookup(registryURL) - CallbackClientInterface callbackObj new
CallbackClientInterfaceImpl() - // register for callback
- h.registerForCallback(callbackObj)
- System.out.println (Registered for
callback.") - h.unregisterForCallback(callbackObj)
- catch (Exception e)
- System.out.println ("Exception in
CallbackClient " e) // end catch - // end of main()
- //end class
38Summary-1
- Stub downloading allows a stub class to be
downloaded to an object client at runtime,
thereby allowing a remote objects implementation
to be modified and its stub class regenerated
without affecting the software on the client
host. - A security manager oversees access restrictions
specified in a Java security policy file, which
can be a system-wide policy file, or a policy
file applied to an individual application only. - For security protection, the use of security
managers is recommended in all RMI applications,
regardless of whether stub downloading is
involved.
39Summary-2
- Client callback
- Client callback is useful for an application
where the clients desire to be notified by the
server of the occurrence of some event. - Client callback allows an object server to make a
remote method call to a client via a reference to
a client remote interface.
40Summary-3
- Client callback
- To provide client callback, the client-side
- supplies a remote interface,
- instantiates a callback interface object
- passes a reference to the object to the server
via a remote method call to the server. - The object server
- collects these client references in a data
structure. - invokes a callback method, defined in the client
remote interface, to pass data to the client,
when the awaited event occurs. - Two sets of stub-skeletons are needed one for
the server remote interface, the other one for
the client remote interface.