1.客户端发起方法调用: 客户端希望调用远程服务器对象上的方法。
2. 存根程序(Stub):客户端的方法调用首先通过存根程序,它类似于远程服务器对象的代理。存根程序将方法调用封装为网络消息,并将其发送给远程服务器对象。
3. 远程引用层(Remote Reference Layer): 它负责处理通信语义,并管理与远程对象之间的通信。它决定将方法调用发送到哪个服务器上,可以是单一的服务器或者多个服务器。
4. 传输层(Transport Layer):在客户端和服务器端之间管理实际的连接。它负责将经过处理的方法调用和数据包发送到服务器主机,并跟踪哪些远程对象可以接受方法调用。
5. 服务器端:在服务器端,传输层接收到方法调用,然后通过骨架(Skeleton)传递给实际的服务器对象。
6. 骨架(Skeleton):骨架是远程服务器对象的代理。它接收传入的方法调用,并实际执行调用服务器对象的方法。
7.方法执行和返回: 服务器对象执行方法并获取返回值。返回值经过骨架、服务器端传输层,最终到达客户端的传输层。
8.返回值传递给存根程序: 最后,返回值经过传输层和远程调用层返回到存根程序,存根程序将返回值提供给客户端的代码使用。
客户端 服务器端
+--------+ +-----------+
| | 发送请求 | |
| | -------------> | |
| Stub | | Skeleton |
| | <------------- | |
| | 接收结果 | |
+--------+ +------------+
举个例子
-
客户端想得到书(A城市): 你在A城市,想要这本书。
-
在A城市的代理(快递员): 你找到了一家快递公司,他们会帮你寄送书。你把你的请求给了这家快递公司。
-
决定送到B城市的途径: 快递公司会决定把这本书寄给B城市的哪家分店。他们会确保书能够被送到正确的地方。
-
在路上的书: 书被放进了快递车,经过了公路、高速公路,最终到达了B城市的分店。
-
在B城市的代理(快递员): 在B城市的快递员接收到了这本书,并准备把书送到你所需要的地方。
-
书到达你手中: 最后,这本书从快递公司的分店送到了你手中。
A城市就像是客户端,B城市就像是服务端。快递公司代表了RMI的各个层次,从决定送到哪里、如何送到那里,直到书最终到达客户手中。这个过程类似于RMI调用中涉及的客户端发起请求,经过网络传输,最终服务器端执行操作并将结果返回给客户端的过程。
stub和Skeleton是两个代理人,分别在客户端电脑上和Server电脑上做代理,找到我们想用的资源
RMI的时序图: