Distributed objects can communicate in whatever method is most convenient for the developers and suits the needs of the application. The developer may implement a custom client-server protocol to be carried over TCP/IP or use one of the many pre-existing techniques. A common strategy is to use one of the general-purpose schemes that allow one object to call methods in another object. These schemes are called by the generic term ‘remote method invocation’ (RMI), but this term is also used by Java programmers to mean a specific scheme and protocol, as will be described. The basic principle of RMI is shown in Figure 2.2.