Sunteți pe pagina 1din 3

LUCRAREA 5

Remote Method Invocation

Limbajul Java permite implementarea unor clase ale căror metode sunt apelabile de la
distanţă. Crearea acestor programe distribuite este posibilă folosind Java Remote Method
Invocation (RMI).
În continuare se descrie o versiune distribuita a programului HelloWorld.
Pentru un asemenea program distribuit avem nevoie de următoarele fişiere sursă:
 interfaţa remote
 serverul remote ce implementează interfaţa remote
 un applet sau un program ce invocă metoda serverului
 codul HTML pentru pagina de web ce refera appletul

Codul interfeţei e următorul:

package examples.hello;
public interface Hello extends java.rmi.Remote
{ String sayHello() throws java.rmi.RemoteException; }

Pentru scrierea unui obiect remote trebuie scrisă o clasă remote ce implementează una
sau mai multe remote interface. Implementarea acestei clase poate să conţină:
 specificarea interfeţelor remote implementate
 definirea constructorului
 implementarea metodelor interfeţelor remote
 crearea şi instalarea unui security manager
 crearea unui (unor) instanţe ale obiectului remote
 înregistrarea obiectelor in RMI registry

Codul serverului este următorul:

package examples.hello;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl
extends UnicastRemoteObject
implements Hello
{
private String name;
public HelloImpl(String s) throws RemoteException {
super();
name = s;
}
public String sayHello() throws RemoteException { return "Hello World!"; }
public static void main(String args[])
{ System.setSecurityManager(new RMISecurityManager());
try
{ HelloImpl obj = new HelloImpl("HelloServer");
Naming.rebind("//myhost/HelloServer", obj);
System.out.println("HelloServer bound in registry"); }
catch (Exception e)
{ System.out.println("HelloImpl err: " + e.getMessage());
e.printStackTrace();}
}}

Apletul care apelează serviciul remote are următorul cod:

package examples.hello;
import java.awt.*;
import java.rmi.*;
public class HelloApplet extends java.applet.Applet {
String message = "";
public void init() {
try
{ Hello obj = (Hello)Naming.lookup("//" +
getCodeBase().getHost() + "/HelloServer");
message = obj.sayHello();}
catch (Exception e)
{ System.out.println("HelloApplet exception: " + e.getMessage());
e.printStackTrace();}
}
public void paint(Graphics g) { g.drawString(message, 25, 50); }
}

Codul HTML pentru applet este:

<HTML>
<title>Hello World</title>
<center> <h1>Hello World</h1> </center>
The message from the HelloServer is:
<p>
<applet codebase="../.."
code="examples.hello.HelloApplet"
width=500 height=120>
</applet>
</HTML>

Makefile-ul proiectului este:

all: Hello.class HelloImpl.class HelloApplet.class \


HelloImpl_Stub.class HelloImpl_Skel.class
Hello.class: Hello.java
javac -d $(HOME)/public_html/codebase Hello.java
HelloImpl.class: HelloImpl.java Hello.class
javac -d $(HOME)/public_html/codebase HelloImpl.java
HelloApplet.class: HelloApplet.java Hello.class
javac -d $(HOME)/public_html/codebase HelloApplet.java
HelloImpl_Stub.class:
HelloImpl_Skel.class:
rmic -d $(HOME)/public_html/codebase examples.hello.HelloImpl
clean:
rm -f *~ #*#

Compilatorul rmic este folosit pentru generarea fisierului stub şi skel (cunoscute şi la
RPC). Lansarea în execuţie a programului se face:

rmiregistry &
java -Djava.rmi.server.codebase=http://localhost/~vdragan/codebase/ \
rmi_examples.hello.HelloImpl &
appletviewer index.html &

Programul rmiregistry permite bind-ul dat de Naming şi înregistrarea obiectului.


Mersul lucrării

Se vor prezenta aspectele teoretice descrise în lucrare.


Pentru o mai clară înţelegere a noţiunilor teoretice se vor implementa şi testa
exemplele prezentate.

S-ar putea să vă placă și