Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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