RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。
image.png
在本地进程中,调用对象方法只需要创建类对象直接进行调用即可,然而如果是不同进程之间或者不同计算机之间的调用,我们需要使用RPC(Remote Procedure Call)调用。而RMI就是JAVA中的专属RPC框架。老规矩,先看一个demo:
接口类:
public interface Hello extends Remote {
public String sayHello(String name) throws RemoteException;
}
接口需要继承Remote类
接口实现类:
public class HelloImpl extends UnicastRemoteObject implements Hello{
//对父类进行初始化
public HelloImpl() throws RemoteException {
super();
}
@Override
public String sayHello(String name) throws RemoteException{
System.out.println("你好" + name);
return "Hello " + name;
}
}
实现类需要继承UnicastRemoteObject,并需要为父类进行初始化。
服务器:
public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {
// 1,创建类对象(接口类对象)
Hello hello = new HelloImpl();
// 2,注册
Registry registry = LocateRegistry.createRegistry(1194);
// 3,绑定
Naming.rebind("rmi://127.0.0.1:1194/he",hello);
System.out.println("服务启动成功");
}
上述服务器试用Naming方法进行绑定。而且注意绑定的对象一定是接口类的对象,因为底层使用了动态代理的方式
客户端:
public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {
Hello hello = (Hello) Naming.lookup("rmi://127.0.0.1:1194/he");
System.out.println(hello.sayHello("yangsir"));
}
访问服务器,获取hello对象,执行方法sayHello。
测试结果:
image.png
image.png
结果说明方法的执行是在服务端,然后将执行结果返回到了客户端。