This document discusses Remote Procedure Calls (RPC) and Remote Method Invocation (RMI) for building distributed and concurrent software. It describes how RMI improves upon RPC by adding object orientation, allowing objects in one process to invoke methods on objects in another process. It also discusses middleware layers for distributed communication and the steps involved in a remote procedure call, including the use of stubs and skeletons. Sample code is provided to illustrate setting up a basic RMI application in Java using interfaces, implementation classes, and a client and server.