RMI代表遠程方法調用。 這是一種允許位於在一個系統(JVM)中的對象訪問/調用在另一個JVM上運行的對象的機制。
RMI用於構建分佈式應用程式; 它提供Java程式之間的遠程通信。 它在java.rmi
包中提供。
RMI應用程式的體系結構
在RMI應用程式中,我們編寫了兩個程式,一個伺服器程式(位於伺服器上)和一個客戶機程式(位於客戶端上)。
- 在伺服器程式中,創建一個遠程對象,該對象的引用可被客戶端(使用註冊表)使用。
- 客戶端程式請求伺服器上的遠程對象,並嘗試調用其方法。
下圖顯示了RMI應用程式的體系結構。
下麵我們來討論這個架構的組件。
- 傳輸層(Transport Layer) - 此層連接客戶端和服務器。它管理現有的連接,並設置新的連接。
- 存根(Stub) - 存根是客戶端上的遠程對象的表示(代理)。 它位於客戶端系統中; 它作為客戶端程式的網關。
- 骨架(Skeleton) - 它位於伺服器端的對象。 存根與此骨架通信以將請求傳遞給遠程對象。
- RRL(遠程參考層) - 它是管理客戶端對遠程對象的引用的層。
RMI應用程式的工作
以下幾點總結了RMI應用程式的工作原理 -
- 當客戶端調用遠程對象時,它被存根最終傳遞給RRL。
- 當客戶端RRL接收到請求時,它會調用對象
remoteRef
的一個名為invoke()
的方法。 它將請求傳遞到伺服器端的RRL。 - 伺服器端的RRL將請求傳遞到伺服器上的最後調用所需對象的Skeleton(伺服器上的代理)。
- 結果一直傳遞給客戶端。
編組和解組
每當客戶端調用接受遠程對象上的參數的方法時,在通過網路發送之前,將參數捆綁到消息中。 這些參數可能是原始類型或對象。 在原始類型的情況下,將參數放在一起並附加標題。 如果參數是對象,那麼它們被序列化。 這個過程被稱為編組。
在伺服器端,打包參數是未分組的,然後調用所需的方法。這個過程被稱為解組。
RMI註冊表
RMI註冊表是放置所有伺服器對象的命名空間。 每次伺服器創建一個對象時,它會使用RMIregistry
(使用bind()
或reBind()
方法)註冊此對象。 這些使用叫作綁定名稱(bind name)的唯一名稱進行註冊。
要調用遠程對象,客戶端需要該對象的引用。客戶端使用其綁定名稱(使用lookup()
方法)從註冊表中獲取對象。
下圖說明瞭整個過程 -
RMI目標
以下是RMI的目標 -
- 最小化應用程式的複雜性。
- 保護類型安全。
- 分佈式垃圾收集。
- 最小化使用本地和遠程對象之間的區別。
上一篇:
下一篇:
Java RMI應用程式