COMP 310
Spring 201
7

Lec25:  Remote Method Invocation (RMI)

Home  Info  Canvas   Java Resources  Eclipse Resources  Piazza

Today we will start exploring the world of Remote Method Invocation or "RMI".  

Information on RMI can be found in the Comp310 Java Resources web pages.

The demo code for today can be obtained by creating a  new project in Eclipse and setting the svn:externals property for the "src" folder to "provided https://svn.rice.edu/r/comp310/course/RMIHelloWorld/provided".

The demo code consists of two executable classes, a "client" and a "server" plus an interface that defines the remote service that the server offers to the client.   

Be sure that the Server machine has the ServerProcess.REGISTRY_PORT and ServerProcess.SERVER_PORT open through its firewall!!
Open ports:  2001-2002 and 2099-2102

 Be sure that launch configuration files for both the client and server have been created!  See the Eclipse Resources web page on Editing the Launch Configuration Parameters
RMI will NOT run unless a proper launch configuration is created!

To run the demo:

  1. Highlight the ServerProcess launch configuration file and click Run.   
  2. Highlight the Client launch configuration file and click Run.

To stop the running server:

  1. Change to the server's console by either closing the console of the client if it open by clicking the "x" on the console tab or by selecting the server's console by pulling down the "Display Selected Console" drop-list on the console tab.
  2. Click the red square "Terminate" button on the console tab. 

 

RMI Hello World

What's going on:

  1. The ServerProcess binds a HelloImpl stub (an IHello interface implementation) to the name "Hello" in the Registry.

  2. The client asks for the name "Hello" in the server's (the machine running ServerProcess) Registry and receives the stub to the HelloImpl object.

  3. The client calls sayHello() on the stub object.

  4. The stub transparently delegates the call all the way across the network to the actual HelloImpl object on the server machine.

  5. The HelloImpl object runs its sayHello() method and returns the result.

  6. The stub returns the result across the network back to the waiting client.

 

Things to try:

To create your own modifications, simply create your own Client, ServerProcess, IHello and HelloImpl classes in your own package by copying the code from the provided package and then adjusting the package references.   Do NOT edit the code in the provided package as you will not be able to commit your code!

  1. Bind multiple IHello implementations to the same name in the Registry:
    1. Start the original ServerProcess.
    2. Change the return value of sayHello() method of the HelloImpl class to return a different value or make a new class implementing IHello that returns a different value (you will need to modify ServerProcess to use this new class if you do this).
    3. In ServerProcess, change the port value that the RMI server object (IHello implementation) is being bound to from SERVER_PORT to SERVER_PORT+1 (Otherwise you might get a port conflict error)
    4. Without terminating the previous ServerProcess , run the ServerProcess again.
    5. Without modifying it, run the Client again.
    6. Even though the original ServerProcess is still running, what is the value retrieved by the Client?   Why?
  2. Bind multiple IHello implementations to different names in the Registry.
    1.  Start a version of the ServerProcess.
    2. Run the Client to verify the value returned is what you expect.
    3. Modify the IHelloImpl's sayHello() method to return a different value or make a new class implementing IHello that returns a different value (you will need to modify ServerProcess to use this new class if you do this).
    4. In ServerProcess, change the port value that the RMI server object (IHello implementation) is being bound to from SERVER_PORT to SERVER_PORT+1 (Otherwise you might get a port conflict error)
    5. Modify the Server's run() method to bind the HelloImpl object with a different name.
    6. Without terminating the previous ServerProcess , run the ServerProcess again.
    7. Without modifying it, run the Client again.   What value is returned?
    8. Modify the Client so that it accesses the new Registry binding name being used in the modified ServerProcess code above.
    9.  Run the Client again.   What value is returned?

 

 

 

 

 

 

 

 

 


© 2017 by Stephen Wong