Java remote method invocation: Difference between revisions

Content deleted Content added
RedBot (talk | contribs)
m r2.7.2) (Robot: Adding hu:Java remote method invocation
BrainStack (talk | contribs)
Link suggestions feature: 3 links added.
 
(143 intermediate revisions by 99 users not shown)
Line 1:
{{Short description|Java application-programming interface}}
{{oneref|date=February 2012}}
[[ImageFile:RMI-Stubs-Skeletons.JPGsvg|thumb|right|400px|A typical implementation model of Java-RMI using [[Class stub|stub]] and [[ClassDistributed object skeletoncommunication#Skeleton|skeleton]] objects. Java 2 SDK, Standard Edition, v1.2 removed the need for a skeleton.]]
 
The '''Java Remote Method Invocation''' [[Application Programming Interface]] (API), or '''Java RMI''',) is a [[Java (programming language)|Java]] application programming interface[[API]] that performs [[remote method invocation]], the object-oriented equivalent of [[remote procedure call]]s (RPC), with support for direct transfer of [[Serialization#Java|serialized]] Java classes and [[Distributed Garbage Collection|distributed garbage-collection]].
 
# The original implementation depends on [[Java Virtual Machine]] (JVM) class -representation mechanisms and it thus only supports making calls from one JVM to another. The protocol underlying this Java-only implementation is known as Java Remote Method Protocol (JRMP). In order to support code running in a non-JVM context, programmers later developed a [[JRMPCommon Object Request Broker Architecture|CORBA]]) version.
# In order to support code running in a non-JVM context, a [[Common Object Request Broker Architecture|CORBA]] version was later developed.
 
Usage of the term '''RMI''' may denote solely the programming interface or may signify both the API and JRMP, [[JRMPIIOP]], or another implementation, whereas the term [[RMI-IIOP]] (read: RMI over [[IIOP]]) specifically denotes the RMI interface delegating most of the functionality to the supporting [[CORBA]] implementation.
 
The basic idea of Java RMI, the distributed garbage-collection (DGC) protocol, and much of the architecture underlying the original Sun implementation, come from the "network objects" feature of [[Modula-3]].
 
==Generalized code==
The programmers of the original RMI API generalized the code somewhat to support different implementations, such as a [[Hypertext Transfer Protocol|HTTP]] transport. Additionally, the ability to pass arguments "[[Call by value|by value]]" was added to CORBA in order to supportbe compatible with the RMI interface. Still, the RMI-IIOP and JRMP implementations do not have fully identical interfaces.
 
RMI functionality comes in the package {{Javadoc:SE|package=java.rmi|java/rmi|module=java.rmi}}, while most of Sun's implementation is located in the <code>sun.rmi</code> package. Note that with Java versions before Java 5.0, developers had to compile RMI stubs in a separate compilation step using <code>'''rmic'''</code>. Version 5.0 of Java and beyond no longer require this step - and static stubs have been deprecated since Java 8.
 
==Jini version==
[[Jini]] offers a more advanced version of RMI in Java. It functions similarly but provides more advanced searchingsecurity, object discovery capabilities, and other mechanisms for [[distributed object]] applications.<ref name="From P2P to Web Services and Grids 2005">Taylor,{{cite book |first=Ian J. |last=Taylor |title=From P2P to Web Services and Grids -: Peers in a Client/Server World. |series=Computer Communications and Networks |publisher=Springer,-Verlag |___location=London |year=2005 |isbn=1852338695 |doi=10.1007/b138333 |url=https://archive.org/details/fromp2ptowebserv0000tayl |oclc=827073874 |url-access=registration }}{{page needed|date=September 2017}}</ref>
</ref>
 
==Example==
The following classes implement a simple client-server program using RMI that displays a message.
 
; <code>RmiServerIntf</code> interface : defines the interface that is used by the client and implemented by the server. This extends the {{Javadoc:SE|module=java.rmi|package=java.rmi|java/rmi|Remote}} interface, which serves to identify an implementing class as one with remotely-invokable methods.
'''<code>RmiServer </code> class'''&mdash;Listens to RMI requests and implements the interface which is used by the client to invoke remote methods.
 
<sourcesyntaxhighlight lang=java>
import java.rmi.Remote;
import java.rmi.RemoteException;
 
public interface RmiServerIntf extends Remote {
String getMessage() throws RemoteException;
}
</syntaxhighlight>
 
; <code>RmiServer</code> class : listens to RMI requests and implements the interface which is used by the client to invoke remote methods.
 
<syntaxhighlight lang=java>
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.*;
 
public class RmiServer extends UnicastRemoteObject implements RmiServerIntf {
public static final String MESSAGE = "Hello World";
implements RmiServerIntf {
public static final String MESSAGE = "Hello world";
 
public RmiServer() throws RemoteException {
super(0); // required to avoid the 'rmic' step, see below
}
 
Line 41 ⟶ 51:
}
 
public static void main(String[] args) throws Exception {
 
public static void main(String args[]) {
System.out.println("RMI server started");
 
// Create and install a security manager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
System.out.println("Security manager installed.");
} else {
System.out.println("Security manager already exists.");
}
 
try { //special exception handler for registry creation
LocateRegistry.createRegistry(1099);
System.out.println("java RMI registry created.");
} catch (RemoteException e) {
Line 60 ⟶ 61:
System.out.println("java RMI registry already exists.");
}
try//Instantiate {RmiServer
RmiServer server = //Instantiatenew RmiServer();
RmiServer obj = new RmiServer();
 
// Bind this object instance to the name "RmiServer"
Naming.rebind("//localhost/RmiServer", objserver);
System.out.println("PeerServer bound in registry");
 
System.out.println("PeerServer bound in registry");
} catch (Exception e) {
System.err.println("RMI server exception:" + e);
e.printStackTrace();
}
}
}
</syntaxhighlight>
</source>
 
; <code>RmiClient</code> class : this is the client which gets the reference (a proxy) to the remote object living on the server and invokes its method to get a message. If the server object implemented java.io.Serializable instead of java.rmi.Remote, it would be serialized and passed to the client as a value.<ref>{{cite web |last1=Wilson |first1=M. Jeff |date=2000-11-10 |df=mdy |url=https://www.infoworld.com/article/2076234/get-smart-with-proxies-and-rmi.html |title=Get smart with proxies and RMI |work=[[JavaWorld]] |access-date=2020-07-18}}</ref>
'''<code>RmiServerIntf </code> class'''&mdash;Defines the interface that is used by the client and implemented by the server.
 
<sourcesyntaxhighlight lang=java>
import java.rmi.Remote;
import java.rmi.RemoteException;
 
public interface RmiServerIntf extends Remote {
public String getMessage() throws RemoteException;
}
</source>
 
'''<code>RmiClient </code> class'''&mdash;This is the client which gets the reference (a proxy) to the remote object living on the server and invokes its method to get a message. If the server object implemented java.io.Serializable instead of java.rmi.Remote, it would be serialized and passed to the client as a value<ref>http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-smartproxy.html</ref>.
 
<source lang=java>
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
 
public class RmiClient {
public static void main(String[] args) throws Exception {
// "obj" is the reference of the remote object
RmiServerIntf objserver = null(RmiServerIntf)Naming.lookup("//localhost/RmiServer");
System.out.println(server.getMessage());
 
public String getMessage() {
try {
obj = (RmiServerIntf)Naming.lookup("//localhost/RmiServer");
return obj.getMessage();
} catch (Exception e) {
System.err.println("RmiClient exception: " + e);
e.printStackTrace();
return e.getMessage();
}
}
 
public static void main(String args[]) {
// Create and install a security manager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
RmiClient cli = new RmiClient();
 
System.out.println(cli.getMessage());
}
}
</syntaxhighlight>
</source>
 
Before running this subj, we need to make 'Stub' file of interface we used. For this task we have the RMI compiller - 'rmic'
*Note: we make stub file from *.class with implementation remote interface, not '*.java'*
<source lang=dos>
rmic RmiServer
</source>
Note that since version 5.0 of J2SE support for dynamically generated stub files has been added, and rmic is only provided for backwards compatibility with earlier run times.<ref>{{cite web|title=Jave RMI Release Notes|url=http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/relnotes.html|publisher=Oracle|accessdate=9 May 2012}}</ref>
 
'''<code>server.policy</code>'''&mdash;This file is required on the server to allow TCP/IP communication for the remote registry and for the RMI server.
 
<source lang=java>
grant {
permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
permission java.net.SocketPermission "127.0.0.1:*", "accept";
};
</source>
 
The server.policy file should be used using the D switch of Java RTE, e.g.:
<source lang=dos>
java.exe -Djava.security.policy=server.policy RmiServer
</source>
 
'''<code>client.policy</code>'''&mdash;This file is required on the client to connect to RMI Server using TCP/IP.
 
<source lang=java>
grant {
permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
};
</source>
 
Before running this example, we need to make a 'stub' file for the interface we used. For this task we have the RMI compiler - 'rmic'
'''<code>no.policy</code>'''&mdash;Also if you have any troubles with connecting, try this file for server or client.
*Note: we make a stub file from the '*.class' file with the implementation of the remote interface, not from the '*.java' file.
 
rmic RmiServer
<source lang=java>
grant {
permission java.security.AllPermission;
};
</source>
 
Note that since version 5.0 of J2SE, support for dynamically generated stub files has been added, and rmic is only provided for backwards compatibility with earlier runtimes,<ref>{{cite web|title=Java RMI Release Notes|url=http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/relnotes.html|publisher=Oracle|access-date=9 May 2012}}</ref> or for programs that don't provide an explicit [[Port (computer networking)|port number]] (or zero) when exporting remote objects, which is required for generated stubs to be possible, as described in the [[Javadoc]] for {{Javadoc:SE|module=java.rmi|java/rmi/server|UnicastRemoteObject}}. See the comment in the constructor above.
==See also==
* [[Cajo project]]
* [[Java serialization]]
 
==References==
Line 169 ⟶ 96:
 
==External links==
*{{cite [web |title=Remote Method Invocation Home |url=http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136424.html |website= Oracle Technology Network for Java Developers |publisher=[[Oracle Corporation]] -|___location=Redwood RemoteShores, MethodCA, InvocationUSA Home|access-date=2014-07-14}}
* [httphttps://downloaddocs.oracle.com/javase/tutorial/rmi/index.html The Java RMI tutorial] - a good starting point to learn RMI. Also check the [httphttps://javadocs.sunoracle.com/j2sejavase/1.5.0/docs/guide/rmi/hello/hello-world.html Hello World in RMI (Java 5)]
* [{{Webarchive|url=https://web.archive.org/web/20120812071936/http://java.sun.com/developer/onlineTraining/rmi/RMI.html the |date=12-08-2012|title=Java RMI online training] (Java 7)|nolink=y}} - Very good for training JavaRMI and as reference
* [httphttps://javadocs.sunoracle.com/j2sejavase/1.5.08/docs/guidetechnotes/guides/rmi/index.html The RMI page in the JDK 8 docs]
* {{Javadoc:SE|package=java.rmi|module=java.rmi|java/rmi}} (Sun's Java API Reference for the RMI package)
* {{cite paperweb | authorauthor1= Wollrath, Ann Wollrath | coauthorsauthor2= Roger Riggs, Roger;| author3 = Jim Waldo, |author3-link=Jim Waldo
| title= A Distributed Object Model for the Java System | version= | pages= | publisher= | date= | doi= | url=http://pdos.csail.mit.edu/6.824/papers/waldo-rmi.pdf | format= PDF
| url=http://pdos.csail.mit.edu/6.824/papers/waldo-rmi.pdf |archive-url=https://ghostarchive.org/archive/20221010/http://pdos.csail.mit.edu/6.824/papers/waldo-rmi.pdf |archive-date=2022-10-10 |url-status=live | access-date= 2009-02-11}}
| accessdate= 2009-02-11}}
* [http://docs.oracle.com/cd/E12840_01/wls/docs103/rmi/rmi_intro.html Programming WebLogic RMI] - an introduction to RMI in Oracle Weblogic.
* [http://notes.corewebprogramming.com/student/RMI.pdf General Remote Method Invocation]
 
[[Category:JavaJDK platformcomponents|RMI]]
[[Category:Remote procedure call]]
[[Category:Articles with example Java code]]
 
[[ar:تقنية استدعاء الطرائق البعادي]]
[[cs:Java remote method invocation]]
[[de:Remote Method Invocation]]
[[es:Java Remote Method Invocation]]
[[fa:فراخوانی متد راه دور جاوا]]
[[fr:Remote method invocation (Java)]]
[[ko:자바 원격 함수 호출]]
[[it:Remote Method Invocation]]
[[lt:RMI]]
[[hu:Java remote method invocation]]
[[nl:Remote method invocation]]
[[ja:Java RMI]]
[[pl:Remote Method Invocation]]
[[pt:RMI]]
[[ru:RMI]]
[[sv:Remote Method Invocation]]
[[uk:RMI]]
[[zh:Java RMI]]