Java 升级之路(四)RMI


Java 升级之路(四)RMIRMI简介RMI调用过程RMI用法JRMP

RMI简介

RMI(Remote Method Invoke):远程方法调用。能够让在某个Java虚拟机上的对象像调用本地对象一样调用另一个Java虚拟机中的对象上的方法。

这种设计和实现很像当今流行的Web API,只不过RMI只支持Java原生调用。

RMI:是 Java 的一组拥护开发分布式应用程序的 API,实现了不同操作系统之间程序的方法调用。

RMI远程方法调用通常由以下几个部分组成:

PS. StubSkeleton对同一套接口进行实现,其中StubClient端调用,仅与Server端进行通信。SkeletonServer端的,监听来自Stub的连接,根据Stub发送的数据进行真正的操作

 

RMI调用过程

RMI的传输是基于反序列化的。

RMI会涉及参数的传递和执行结果的返回。参数或者返回值可以是基本数据类型,当然也有可能是对象的引用。所以这些需要被传输的对象必须可以被序列化,这要求相应的类必须实现java.io.Serializable接口,并且客户端的serialVersionUID字段要与服务器端保持一致。

JVM之间通信时,RMI对远程对象和非远程对象的处理方式是不一样的,它并没有直接把远程对象复制一份传递给客户端,而是传递了一个远程对象的StubStub基本上相当于是远程对象的引用或者代理(Java RMI使用到了代理模式)。Stub对开发者是透明的,客户端可以像调用本地方法一样直接通过它来调用远程方法。Stub中包含了远程对象的定位信息,如Socket端口、服务端主机地址等等,并实现了远程调用过程中具体的底层网络通信细节。

调用流程图如下:

具体过程为:

  1. 客户端通过客户端的Stub对象欲调用远程主机对象上的方法
  2. Stub代理客户端处理远程对象调用请求,并且序列化调用请求后发送网络传输
  3. 服务端远程调用Skeleton对象收到客户端发来的请求,代理服务端反序列化请求,传给服务端
  4. 服务端接收到请求,方法在服务端执行然后将返回的结果对象传给Skeleton对象
  5. Skeleton接收到结果对象,代理服务端将结果序列化,发送给客户端
  6. 客户端Stub对象拿到结果对象,代理客户端反序列化结果对象传给客户端

 

RMI用法

这里假设Client需要获取到Server端的data

代码如下

Server.java

 

Client.java

 

利用wireshark来查看传输的数据

红色部分为stubskeleton发送序列化请求

蓝色部分为skeletonstub返回序列化结果

JRMP

JRMP (Java Remote Method Protocol): Java远程方法协议

是特定于Java技术的、用于查找和引用远程对象的协议。

是运行在Java远程方法调用 (RMI) 之下、TCP/IP之上的线路层协议。

JRMP是一个Java特有的、适用于Java之间远程调用的基于流的协议,要求客户端和服务器上都使用Java对象。

JRMP是一个协议,是用于Java RMI过程中的协议,只有使用这个协议,方法调用双方才能正常的进行数据交流。

Java本身对RMI规范的实现默认使用的是JRMP协议