Distributed
systems require that computations running in different address
spaces, potentially on different hosts, be able to communicate. For
a basic communication mechanism, the JavaTM programming language supports sockets, which
are flexible and sufficient for general communication. However,
sockets require the client and server to engage in
applications-level protocols to encode and decode messages for
exchange, and the design of such protocols is cumbersome and can be
error-prone.

An alternative to sockets is Remote
Procedure Call (RPC), which abstracts the communication interface
to the level of a procedure call. Instead of working directly with
sockets, the programmer has the illusion of calling a local
procedure, when in fact the arguments of the call are packaged up
and shipped off to the remote target of the call. RPC systems
encode arguments and return values using an external data
representation, such as XDR.

RPC, however, does not translate well
into distributed object systems, where communication between
program-level objects residing in different address spaces
is needed. In order to match the semantics of object invocation,
distributed object systems require remote method
invocation or RMI. In such systems, a local surrogate (stub)
object manages the invocation on a remote object.

The Java platform's remote method
invocation system described in this specification has been
specifically designed to operate in the Java application
environment. The Java programming language's RMI system assumes
the homogeneous environment of the Java virtual machine (JVM), and
the system can therefore take advantage of the Java platform's
object model whenever possible.