Introduction to Remote Method Invocation (RMI)

COMP 310    Java Resources  Eclipse Resources

(Back to Java RMI)   

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

The code for the program described below has been migrated to GitHub Classroom and is available through the invitation link provided in the current semester's Canvas site.

 

"RMI Hello World" Demo (hello_basic package)

Note: The hello_discovery package is essentially the same functionality as the hello_basic package but refactored into full MVC, GUI-based applications. The only thing that it really adds is the ability to use the discovery server to obtain IP address and Registry-bound stub information about other remote computers. The discussion below is framed in terms of the hello_basic package but is applicable to either package. Feel free to work on whichever package you are most comfortable at the moment.

If you are using the hello_discovery package, be sure to change the "friendly name" given to the discovery model when it starts.

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-2003 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:

You are free to modify any code that is not in the provided package to suit your needs.

  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?

 

 

 

 

 

 

 

 

 

© 2020 by Stephen Wong