天天看點

RMI遠端方法調用

RMI的程式設計思想    

 對于客戶機端,需要一些特定的代碼來引用遠端對象。而對于伺服器端,必須定義類并執行個體化類的遠端對象,伺服器端的代碼必須能夠登記這些對象,并将他們的方法向客戶機導出。 而用戶端與伺服器端都要實作一個接口,這個接口定義了可以遠端調用的方法。最後一點是,客戶機可能将對象當做參數來傳遞,而遠端對象上的方法可以傳回一個對象。這點是靠Java對象序列化來實作的。 

RMI架構

RMI架構封裝了所有底層通信細節,并且解決了編組、分布式垃圾收集、安全檢查和并發性等通用問題。有了現成的架構,開發人員就隻需專注于開發與特定問題領域相關的各種本地對象和遠端對象。

RMI遠端方法調用

RMI采用客戶/伺服器通信方式

RMI采用客戶/伺服器通信方式。在伺服器上部署了提供各種服務的遠端對象,用戶端請求通路伺服器上遠端對象的方法。

如圖所示,HelloServiceImpl是一個遠端對象,它運作在伺服器上,用戶端請求調用HelloServiceImpl對象的echo()方法

RMI遠端方法調用

 RMI架構采用代理來負責客戶與遠端對象之間通過Socket進行通信的細節。RMI架構為遠端對象分别生成了用戶端代理和伺服器端代理。位于用戶端的代理類稱為存根(Stub),位于伺服器端的代理類稱為骨架(Skeleton)。

RMI遠端方法調用

存根采用一種與平台無關的編碼方式,把方法的參數編碼為位元組序列,這個編碼過程稱為參數編組。

RMI主要采用Java序列化機制進行參數編組。接着,存根把以下請求資訊發送給伺服器:

被通路的遠端對象的名字。

被調用的方法的描述。

編組後的參數的位元組序列。

伺服器端接收到用戶端的請求資訊,然後由相應的骨架對象來處理這一請求資訊,骨架對象執行以下操作:

反編組參數,即把參數的位元組序列反編碼為參數。

定位要通路的遠端對象。

調用遠端對象的相應方法。

擷取方法調用産生的傳回值或者異常,然後對它進行編組。

把編組後的傳回值或者異常發送給客戶。

大緻說來,建立一個RMI應用包括以下步驟:

(1)建立遠端接口:繼承java.rmi.Remote接口。

(2)建立遠端類:實作遠端接口。

(3)建立伺服器程式:負責在rmiregistry系統資料庫中注冊遠端對象。

(4)建立客戶程式:負責定位遠端對象,并且調用遠端對象的方法。

建立的RMI應用的類框圖。

其中HelloService是一個遠端接口,它繼承了java.rmi.Remote接口,HelloServiceImpl類實作了該接口,

并且繼承了java.rmi.server.UnicastRemoteObject類

SimpleClient和SimpleServer類分别是客戶程式和伺服器程式。

RMI遠端方法調用