RMI
Java RMI 指的是远程方法调用 (Remote Method Invocation)。RMI能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法, 其威力体现在它强大的开发分布式网络应用的能力上,它可以被看作是RPC的Java版本。
与WebService相比,RMI编写代码更加简单,在小型应用开发上更加合适,相对地,RMI只能在java中使用,而WebSerce可以跨平台。
RMI示意图:

#Demo
定义接口,必须继承Remote
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloService extends Remote{
    String sayHello() throws RemoteException;
}
实现接口,必须继承UnicastRemoteObject并在空构造中抛出RemoteException, 方法的返回值必须为原语类型或者序列化类型.
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {
    protected HelloServiceImpl() throws RemoteException {}
    @Override
    public String sayHello() throws RemoteException {
        return "server says. 'Hey'";
    }
}
注册服务
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RegistryBook {
    public static void main(String[] args) throws RemoteException, MalformedURLException {
        Registry r = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
        r.rebind("HelloService", new HelloServiceImpl());
    }
}
在另一台虚拟机上运行客户端代码,需要获得服务接口文件
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class Client {
    public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException {
            HelloService helloService = (HelloService) Naming.lookup("rmi://localhost:1099/HelloService");
            System.out.println(helloService.sayHello());
    }
}
注意,如果你使用的较为古老的jdk,你可能需要通过jdk内置的rmic命令生成stub以及skeleton文件,并将stub文件提供给客户端使用。