RMI 實作

RMI 實作包含三個抽象層。

這些抽象層如下:
  1. Stub 和 Skeleton 層,它會截取用戶端對介面參照變數所進行的方法呼叫,並將這些呼叫重新導向至遠端 RMI 服務。
  2. 遠端參照 層瞭解如何解譯及管理從用戶端到遠端服務物件的參照。
  3. 底層是 傳輸 層,以網路中機器之間的 TCP/IP 連線為基礎。 它提供基本連線功能,以及一些防火牆滲透策略。
此圖顯示透過 RMI 系統的用戶端程式與伺服器程式之間的關係。 RMI 系統包括用戶端和伺服器端上的 Stub 和架構,以及由傳輸層鏈結的遠端參照層。

在 TCP/IP 層頂端, RMI 使用稱為 Java™ 遠端方法通訊協定 (JRMP) 的佈線層次通訊協定,其運作方式如下:

  1. 需要遠端行為的物件應該延伸 RemoteObject 類別,通常是透過 UnicastRemoteObject 子類別。
    1. UnicastRemoteObject 子類別會匯出遠端物件,使其可用於服務送入的 RMI 呼叫。
    2. 匯出遠端物件會建立新的伺服器 Socket ,其會連結至埠號。
    3. 也會建立一個執行緒來接聽該 Socket 上的連線。 伺服器已向登錄登錄。
    4. 用戶端會從登錄取得連接伺服器的詳細資料。
    5. 使用來自登錄的資訊 (包括伺服器接聽 Socket 的主機名稱及埠詳細資料) ,用戶端會連接至伺服器。
  2. 當用戶端對伺服器發出遠端方法呼叫時,它會建立 TCPConnection 物件,在指定的埠上開啟伺服器的 Socket ,並使用 StreamRemoteCall 類別透過此連線來傳送 RMI 標頭資訊和配置引數。
  3. 在伺服器端:
    1. 當用戶端連接至伺服器 Socket 時,會指派新的執行緒來處理送入呼叫。 原始執行緒可以繼續接聽原始 Socket ,以便可以從其他用戶端進行其他呼叫。
    2. 伺服器會讀取標頭資訊,並建立自己的 RemoteCall 物件來處理從 Socket 解除配置 RMI 引數。
    3. Transport 類別的 serviceCall() 方法透過分派送入呼叫來提供服務
    4. dispatch() 方法會對物件呼叫適當的方法,並將結果向下推回佈線。
    5. 如果伺服器物件擲出異常狀況,伺服器會捕捉它,並將它配置成佈線關閉,而不是回覆值。
  4. 回到用戶端:
    1. RMI 的回覆值會解除配置,並從 Stub 傳回用戶端程式碼本身。
    2. 如果從伺服器擲出異常狀況,則會解除配置並從 Stub 擲出。