1.RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。
Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
我们知道远程过程调用(Remote Procedure Call, RPC)可以用于一个进程调用另一个进程(很可能在另一个远程主机上)中的过程,从而提供了过程的分布能力。Java 的 RMI 则在 RPC 的基础上向前又迈进了一步,即提供分布式对象间的通讯。
2.RMI的基本原理:实际上就是利用了Socket,实现了两个虚拟机之间的通信,不过这个通信不是在传统的进程,线程的层面上,而是在对象和对象之间的通信。JAVA中有相应的RMI接口,实际上和网络编程非常类似。
3.首先是公共接口,这个接口是服务端需要实现的
package Demo;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IHello extends Remote {
public String SayHello(String s)throws RemoteException;
}
这个接口,对于服务器来说,服务器必须实现这个接口,对于客户端的调用者来说,这就是一个信息栏,它显示了服务端有哪些功能。
4.然后是服务器端,服务器端有三个类,第一个就是公共接口,第二个是这个接口的实现:
package Demo;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements IHello {
protected HelloImpl()throws RemoteException{
super();
}
public String SayHello(String name)throws RemoteException
{
return "Hello "+name+"^_^";
}
}
第三个类,就是和客户端交互使用的,运行在服务端上的主函数:
package Demo;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class HelloServer {
public static void main(String[] args) {
try
{
IHello hello=new HelloImpl();
LocateRegistry.createRegistry(1099);
Registry registry=LocateRegistry.getRegistry();
registry.bind("hello",hello);
System.out.println("Server is Ready:");
}catch (Exception e)
{
e.printStackTrace();
}
}
}
服务端首先产生一个对象,然后把对象绑定到一个端口。Register其实就是注册表的意思,实现了对象到地址的绑定。这里绑定的是本地主机。
然后服务端就完成了。接下来是客户端的调用
5.客户端存在两个类,第一个就是我们刚才说的那个接口类,他是为了表明服务器上这个类有哪些方法可以被调用。第二个类就是我们需要做事情的类,
package Demo;
import java.rmi.Naming;
import java.util.Scanner;
public class Hello_RMI_Client {
public static void main(String[] args) {
try {
IHello hello = (IHello) Naming.lookup("rmi://localhost:1099/hello");
Scanner cin=new Scanner(System.in);
while(cin.hasNext()) {
String s = cin.next();
System.out.println(hello.SayHello(s));
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
这个类首先在对应的端口找到对象,然后调用这个对象的方法,完成远程调用。
6.RMI在分布式上应用很多,底层实现其实也很容易理解的,基本的就是Socket编程,有兴趣的可以参考这位老哥的博客,写的还是很详细的:https://blog.csdn.net/xinghun_4/article/details/45787549