明天早上詳細寫下兩個過程:java
一、初始化過程(服務器)git
二、客戶端調用過程(包括客戶端流程、調用服務端流程、返回客戶端流程)服務器
- 當客戶端經過RMI註冊表找到一個遠程接口的時候,所獲得的實際上是遠程接口的一個動態代理對象。
- 當客戶端調用其中的方法的時候,方法的參數對象會在序列化以後,傳輸到服務器端。
- 服務器端接收到以後,進行反序列化獲得參數對象。
- 並使用這些參數對象,在服務器端調用實際的方法。
- 調用的返回值Java對象通過序列化以後,再發送回客戶端。
- 客戶端再通過反序列化以後獲得Java對象,返回給調用者。
- 這中間的序列化過程對於使用者來講是透明的,由動態代理對象自動完成。
除了序列化以外,RMI還使用了動態類加載技術:代理
- 當須要進行反序列化的時候,若是該對象的類定義在當前JVM中沒有找到,RMI會嘗試從遠端下載所需的類文件定義。
- 能夠在RMI程序啓動的時候,經過JVM參數java.rmi.server.codebase來指定動態下載Java類文件的URL。
具體執行筆記參看代碼註釋code