RMI 介绍以及原理
-
RMI介绍:远程方法调用(RMI)顾名思义是一台机器上的程序调用另一台机器上的方法。这样可以大致知道RMI是用来干什么的,但是这种理解还不太确切。RMI是Java支撑分布式系统的基石,例如著名的EJB组件。RMI是远程过程调用(RPC)的一种面向对象实现,RMI底层是通过
socket通信
和对象序列化技术
来实现的。 -
RMI原理:RMI的目的就是要使运行在不同的计算机中的对象之间的调用表现得像本地调用一样。在 RMI 中, 远程服务的定义是存放在继承了 Remote 的接口中。远程服务的实现代码存放在实现该定义接口的类中。RMI 支持两个类实现一个相同的远程服务接口: 一个类实现行为并运行在服务器上, 而另一个类作为一个远程服务的代理运行在客户机上。客户程序发出关于代理对象的调用方法, RMI 将该调用请求发送到远程 JVM 上, 并且进一步发送到实现的方法中。实现方法将结果发送给代理, 再通过代理将结果返回给调用者。
-
RMI 构建三个抽象层, 高层覆盖低层, 分别负责Socket通信, 参数和结果的序列化和反序列化等工作。存根( Stub) 和骨架( Skeleton) 合在一起形成了 RMI 构架协议。下面的引用层被用来寻找各自的通信伙伴, 在这一层还有一个提供名字服务的部分, 称为注册表( registry) 。最下一层是传输层, 是依赖于 TCP/IP 协议实现客户机与服务器的互联。
RMI 实践。
0、构建接口以及实现类,接口即成Remote
public interface HelloDefine extends Remote {
public String helloWorld() throws RemoteException;
public String sayHello(String name) throws RemoteException;
}
public class HelloDefineImp extends UnicastRemoteObject implements HelloDefine {
/**
*
*/
private static final long serialVersionUID = 1L;
public HelloDefineImp() throws RemoteException {
super();
}
public String helloWorld() throws RemoteException {
return "Hello AlphaGo!";
}
public String sayHello(String name) throws RemoteException {
return "Hello" + name +"!";
}
}
1、构建服务器:把服务的对象注册到RMI注册服务器上。
public void server() throws RemoteException, MalformedURLException, AlreadyBoundException {
hello = new HelloDefineImp();
//远程对象注册表实例
LocateRegistry.createRegistry(8888);
//把远程对象注册到RMI注册服务器上
Naming.bind("rmi://localhost:8888/Hello", hello);
System.out.println("server:对象绑定成功!");
}
2、构建客户端:获取RMI上被注册的对象
public void client() throws MalformedURLException, RemoteException, NotBoundException {
//在RMI注册表中查找指定对象
hello = (HelloDefine) Naming.lookup("rmi://localhost:8888/Hello");
//调用远程对象方法
System.out.println("client:");
System.out.println(hello.helloWorld());
System.out.println(hello.sayHello("神之一手"));
}
3、调用:使用时,先调用注册服务的方法,在进行客户端的调用
@Test
public void testServer() throws RemoteException, MalformedURLException, AlreadyBoundException {
HelloServer server = new HelloServer();
server.server();
while(true);
}
@Test
public void testClient() throws MalformedURLException, RemoteException, NotBoundException {
HelloClient client = new HelloClient();
client.client();
}