| COMP 310 
		 Fall 2015
 | Lec25:  Remote 
		Method Invocation (RMI) | 
	
		|            | 
Today we will start exploring the world of Remote Method Invocation or "RMI".   
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!!
To run the server:
	- Highlight the ServerProcess file and click
	Run.   
	
		- The ServerProcess must be started first, 
		otherwise the Client will have nothing to 
		connect to.
- You should see a "Server ready" message 
		on the console if the Server has started 
		succesfully.
 
- Highlight the Client file and click
	Run.
		- The client should instantiate, connect to the 
		ServerProcess, print the response from the Server 
		and exit.
- To connect to a remote machine, edit the launch configuration for 
		the Client and put the IP address for the 
		remote server as a "Program Argument".   
		See the Eclipse Resources web page on
		Editing the Launch 
		Configuration Parameters. 
 
To stop the running server:
	- 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.
- Click the red square "Terminate" button on the console tab.  
 

What's going on:
	- 
	The ServerProcess binds a
	HelloImpl 
	stub (an IHello interface implementation) to the name "Hello" 
	in the Registry. 
- 
	The client asks for the name "Hello" 
	in the server's (the machine running ServerProcess) Registry and receives the stub to the
	
	HelloImpl object. 
- 
	The client calls sayHello() 
	on the stub object. 
- 
	The stub transparently delegates the call all the way 
	across the network to the actual 
	HelloImpl object 
	on the server machine. 
- 
	The 
	HelloImpl object runs 
	its sayHello() method and returns the result. 
- 
	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!
	- Bind multiple IHello implementations to the 
	same name in the Registry:
		- Start the original ServerProcess.
- 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).
- 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)
- Without terminating the previous 
		ServerProcess , run the ServerProcess again.
		
- Without modifying it, run the Client 
		again.
- Even though the original ServerProcess is 
		still running, what is the value retrieved by the 
		Client?   Why?
 
- Bind multiple IHello implementations to 
	different names in the Registry.
		-  Start a version of the ServerProcess.
- Run the Client to verify the value 
		returned is what you expect.
- 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).
- 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)
- Modify the Server's
		run() method to bind the
		HelloImpl object with a different name.
- Without terminating the previous 
		ServerProcess , run the ServerProcess again.
		
- Without modifying it, run the Client 
		again.   What value is returned?
- Modify the Client so that it accesses 
		the new Registry binding name being used in the modified
		ServerProcess code above. 
-  Run the Client again.   
		What value is returned?
 
 
 
 
 
 
 
 
 
 
© 2015 by Stephen Wong