Use RMI for distributed interaction and RMI for distributed interaction
Content Overview:
- RMI example
- RMI Architecture
- RMI API
RMI example
Before learning about RMI, let's take an example:
// Service interface package com. fjn. java. rmi. quickstart. server; import java. rmi. remote; import java. rmi. remoteException; public interface Hello extends Remote {public String sayHello (String str) throws RemoteException;} // service implementation package com. fjn. java. rmi. quickstart. server; import java. io. serializable; import java. rmi. remoteException; public class HelloImpl implements Hello, Serializable {protected HelloImpl () throws RemoteException {super ();} private static final long serialVersionUID = response; @ Override public String sayHello (String str) {return "Hello," + str ;}// Server-side Publishing Service: package com. fjn. java. rmi. quickstart. server; import java.net. malformedURLException; import java. rmi. alreadyBoundException; import java. rmi. notBoundException; import java. rmi. remoteException; import java. rmi. registry. locateRegistry; import java. rmi. registry. registry; import java. rmi. server. secret; public class ServerTest {public static void main (String [] args) throws RemoteException, exceptions, InterruptedException, MalformedURLException, NotBoundException {// create Registry = LocateRegistry. createRegistry (9998); Hello stub = (Hello) UnicastRemoteObject. exportObject (new HelloImpl (), 0); // bind the ref to the registry. rebind ("Hello", stub); Hello stub2 = (Hello) registry. lookup ("Hello"); System. out. println (stub2); Thread. sleep (1000*60*60 );}}
Execution result:
Hello, zhang sanHello, Zhang san
RMI Architecture
The figure above shows the architecture of RMI. Design Description: The Server only needs to register a name (unique) for a remote object from a Registry ), then you can wait for the client to use it. Before the client calls a remote method, go to the Registry look up (by name), find the corresponding object (by referencing the object), and then call the method on the client. Because the client obtains the reference of a remote object, it is called directly.
In some cases, the client obtains the bytecode of this Class from the server, and the server also obtains the bytecode of some classes from the client. The premise is that the other party has a Web Server. URL protocol (e.g., HTTP, FTP, file, etc .).
RMI APIRemote
TheRemote
Interface serves to identify interfaces whose methods may be invoked from a non-local virtual machine. any object that is a remote object must directly or indirectly implement this interface. only those methods specified in a "remote interface", an interface that extendsjava.rmi.Remote
Are available remotely.
There is no method in this interface. This interface is only a tag to mark interfaces that can be used locally. That is to say, if this interface can be used by the RMI client, it must be extends or Remote sub-interface.
The objects that implement the Remote interface are called Remote objects. RMI is used in distributed programs, so remote objects are also called distributed objects.
Remote Interface Design Principles:
1) must inherit the Remote interface
2) The methods declared in the remote interface must meet the following requirements:
A: The method must throw java. rmi. RemoteException (IOException, Exception is also acceptable, because these two exceptions are the parent class of RemoteException ).
B: In the Declaration of the remote method: If the remote object contains a parameter or return value, you must use the remote interface itself.
3) if the remote interface inherits other non-remote interfaces, as long as the remote method meets the requirements in 2. As a Remote interface, to inherit the Remote interface, the methods directly declared in this Remote interface must meet the requirements in 2. Methods inherited from non-remote interfaces must also meet the requirements in 2.
4) the Serializable interface must be implemented to implement the interface.
RemoteException
To ensure the normal operation of the program during Remote calls, a RemoteException or its parent class: IOException and Exception must be thrown for each remote method.
When Will RemoteException be thrown?
1) Protocol Error
2) When the communication fails (the Server rejects the request or the connection fails)
3) problems with parameters or interfaces during the marshall and unmarshall Processes
Registry, LocateRegistry
We know that Registry is a Registry. Used to register the provided remote service.
The Registry class provides storage and remote object retrieval (during storage, the reference of the remote object is bound to a name, and the name is unique, so you can obtain it by name ).
The following methods are provided:
Bind, unbind, and rebind are used to bind and unbind a remote object from a specified name.
List: Used to list the names of bound remote objects. The returned result is an array.
In addition, it is very important to store the stub object in the Registry. The object is on the RMI Server.
When the client finds (loopup) through Naming or Registry, all objects are stub. Then, use the serialization and deserialization functions of Stub to communicate with the Server.
Relationship between LocateRegistry and Registry
LocateRegistry is used to locate the location of the Registry on the network. Knowing the location of the Registry on the network, you can obtain the Registry object. Based on the Registry object, you can find the remote object to be used, find the remote object and you can call the remote method.
Naming
The Naming class provides some methods to store and obtain reference of remote objects (stored in the Registry.
The following methods are provided:
The provided method has a name parameter, which is of the string type. It has a standard format (it is a URL, but the schema part in the URL is missing, and the schema is rmi ). Format:
// Host: port/name or rmi: // host: port/name
Host is the host of the Registry to be located, and the port is also.
Naming is a tool class that provides static methods, but the methods are indeed the same as those in Registry. So far, we have learned two ways to obtain and bind remote objects.
That is to say, Registry is available on both the client and server. Binding is used for the server and obtaining is used for the client.
Method 1: Use Registry to bind or obtain the stub of a remote object. Method 2: Use Naming directly to bind or obtain the stub of a remote object.