(Java Remote Method Invocation):java远程方法调用,是一种用于实现远程过程调用的应用程序编程接口,它使客户机上运行的程序可以调用远程服务器上的对象。其用于不同JAVA虚拟机之间的通信,这些JAVA虚拟机可以在不同的主机上,也可以在同一主机上。
简单来说,就是两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
RMI主要分为三部分:
RMI Registry注册中心 RMI Client 客户端 RMI Server服务端
其中RMI注册中心是一个放置所有服务器对象的名称空间。服务器每次创建一个对象时,都会向RMIregistry注册该对象(使用bind( )或reBind( )方法),这些是使用称为绑定名称的唯一名称注册的。
要调用远程对象,客户端需要该对象的引用。那时,客户端使用其绑定名称(使用lookup( )方法)从注册表中获取对象。
1、客户端调用客户端本地的stub类(相当于代理,用于与服务器端的通信) 2、客户端本地的stub类把信息序列化发给服务器端的skeletons类(也可认为是代理) 3、服务器端的skeletons类把信息反序列化交给服务器端的对应类进行处理 4、服务器端对应类处理完后将结果返回给服务器端的skeletions类 5、skeletions类序列化数据发送给客户端本地的stub类 6、客户端本地的stub类把数据反序列化后将结果返回给客户端
RMI服务器实现
在Java中,只要一个类继承了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。Remote接口用于标识其方法可以从非本地虚拟机上调用的接口。任何远程对象都必须直接或间接实现此接口。只有在远程接口中指定的这些方法才可被远程调用。
远程对象必须实现java.rmi.server.UniCastRemoteObject类,这样才能保证客户端访问获得远程对象时,该远程对象将会把自身的一个拷贝以Socket的形式传输给客户端,此时客户端所获得的这个拷贝称为“存根”,而服务器端本身已存在的远程对象则称之为“骨架”。其实此时的存根是客户端的一个代理,用于与服务器端的通信,而骨架也可认为是服务器端的一个代理,用于接收客户端的请求之后调用远程方法来响应客户端的请求。
注册远程对象,向客户端提供远程对象服务,远程对象是在远程服务上创建的,你无法确切地知道远程服务器上的对象的名称,但是,将远程对象注册到RMI注册中心之后,客户端就可以通过RMI中心请求到该远程服务对象的stub了,利用stub代理就可以访问远程服务对象了。
客户端实现RMI远程方法调用。