rmi開發基本步驟

RMI基本體系結構簡介
  RMI通過TCP/IP在內部使用Socket,象其名稱暗示的那樣,它能夠幫助我們查找並執行遠程對象的方法。RMI的目的是讓位於不同JVM中的對象,在外觀及行爲上都像是本地的對象。
  
  通常,我們把調用這種遠程對象的JVM,稱爲客戶機;而把包括這種遠程對象的JVM,稱爲服務器。
  
  儘管對一個遠程對象的引用和獲得對本地對象的引用有所不同,但我們可以把遠程對象像本地對象一樣使用。應用程序並不知道一個對象是遠程的還是本地的。實際上,遠程對象上被調用的方法與本地對象上調用的方法,具有相同的語法結構。
  
  作爲RMI的底層(會包含複雜的Socket操作),它會自動截獲方法調用,找到遠程對象,然後處理遠程請求。筆者認爲,RMI設計的重要之處,就在於不但在設計上實現了遠程訪問功能,而且實現了設計的透明性。
  
  RMI的基本體系結構,概括起來說,由三個抽象層組成:
  
  1、存根/框架層(Stubs/Skeletons Layer)
  
  RMI爲我們引入了兩種特殊類型的對象,稱爲存根(Stub)和框架(Skeleton),它們組成了RMI的第一層。
  
  在遠程通信的時候,要利用TCP/IP協議,做很多底層數據的打包傳輸。運用Java技術,我們先要把數據或者對象轉換成字節流(byte stream),便於網絡傳輸,這個過程叫彙集(marshaling);當收到遠程傳來的字節流後,我們要把流信息轉換成對象或者數據,這個過程叫解讀(unmarshaling),它與彙集剛好相反。
  
  Stub和Skeleton層位於實際應用程序之下,建立在Proxy(代理)設計方案之上。Stub類的作用是遠程服務器實現的代理的角色,Stub是客戶方對象;Skeleton類用於幫助對象通過RMI鏈接與Stub通信,它從鏈路中讀取方法調用的參數,向遠程服務實現對象進行調用,接受返回值,然後再把返回值寫回到Stub。
  
  2、遠程引用層(Remote Reference Layer)
  
  遠程引用層定義和支持着RMI連接的調用語義(semantics)。
  
  RMI進行遠程訪問要用到JRMP(Java Remote Method Protocol,即Java遠程方法協議),這一層提供專用於JRMP的RemoteRef對象,它位於java.rmi.server包內,代表着遠程對象的一個句柄。RemoteRef使用遠程引用來執行遠程對象的一個遠程方法調用。
  
  3、傳輸層(Transport Layer)
  
  傳輸層在JVM之間建立基於流的網絡連接,並且負責設置和管理這些連接。這時候,RMI使用一種線級(wire-level)協議進行基於TCP/IP的連接,該協議就是Java遠程方法協議(JRMP,即Java Remote Method Protocol)。
  
  在JDK版本1.2開始,JRMP不再需要Skeleton,而是使用reflection來建立與遠程服務的連接。爲了生成Stub,我們須用rmic。
  當前的RMI實現中,傳輸層建立在TCP/IP基礎上,設計用於在客戶和服務器之間建立一條連接(即使聯網有障礙)。



發的基本步驟

  我們使用RMI編寫Client/Server模式(客戶/服務器)應用程序,包括6個基本步驟:
  
  1) 定義遠程接口
  
  2) 實現遠程接口
  
  3) 準備遠程調用的服務器對象
  
  4) 生成殘根Stub(客戶代理)和框架Skeleton(服務器實體)
  
  5) 用rmiregistry找到遠程對象
  
  6) 運行測試RMI分佈式應用
  
  開發企業信息發佈系統實例
    現在,我們就以開發公司信息發佈系統爲例,把主模塊(主要的類文件)的名稱暫定爲InfoDistributeService(信息發佈服務),爲了保持應用開發的數據一致性和清晰度,接下來涉及的其它模塊命名也將以這個模塊命名爲基準。
  
  1、定義遠程接口
  
  Java RMI運行環境要求任何可以遠程調用的方法必須放在遠程接口中。
  
  該遠程接口用來擴展java.rmi.Remote接口,在Java API中,可以發現它沒有任何方法,只是個標誌性接口,這樣,可以讓Java運行環境(JRE)認識每個接口的特殊屬性,以便能夠遠程訪問。
  
  因此,按照信息發佈服務的命名(InfoDistributeService),首先須將InfoDistributeRemote定義爲遠程接口,同時僅放入一個供測試的方法 getRemoteInfo()來實現編碼,將所有模塊至於新建的enterprise.distribute包中,代碼如下:
  
  // -----------InfoDistributeRemote.java-------------------
  package enterprise. distribute;
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  public interface InfoDistributeRemote extends Remote{
  public String getRemoteInfo() throws RemoteException;
  }
  
  2、實現遠程接口
  
  這是一個實現遠程對象的類。如果實現了遠程接口,就能夠覆蓋(override)該對象中的所有方法,因此,遠程對象的實現類將真正包含我們希望導出的方法的代碼。
  
  在遠程信息發佈系統中,我們至少實現一個遠程接口的對象,它就是遠程可訪問的對象。這裏,InfoDistributeService類可以爲我們生成遠程可訪問對象的實例:
  
  // -----------InfoDistributeService.java------------------
  package enterprise. distribute;
  import java.rmi.RemoteException;
  import java.rmi.server.UnicastRemoteObject;
  public class InfoDistributeService
  extends UnicastRemoteObject implements InfoDistributeRemote{
  public InfoDistributeService() throws RemoteException{
  super();
  }
  // The return value of the method only for testing...
  public String getRemoteInfo(){
  return "Hello! I am a remote object.";
  }
  }
  
  InfoDistributeService類實現遠程接口InfoDistributeRemote,並繼承java.rmi.server.UnicastRemoteObject。
發佈了16 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章