程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 用RMI進行遠程方法調用

用RMI進行遠程方法調用

編輯:JAVA編程入門知識

  遠程方法調用(RMI)機制可以把面向對象的思想進一步擴展,因為你可以調用的對象不僅可以在本機上,也可以在別的主機上。本文就簡單介紹rmi的編程方法。
  
  首先介紹一些簡單的rmi的概念。
  
   <!-- frame contents --> <!-- /frame contents -->   1, 服務器和客戶:在rmi中,假如有一個對象進行遠程方法調用,這個對象就叫做客戶機對象,而遠程對象則被稱為服務器對象。
  
  2, 創建服務器對象的服務器程序:這個程序用來創建服務器對象,注冊這個對象,使得客戶可以通過注冊的名稱訪問服務器對象。
  
  3, 接口(interface),接口可以讓客戶端了解服務器所能做的工作。更具體的說,就是它列出了可以在服務器上執行的所有方法。客戶端程序必須能夠找到這個類,否則就不能執行對服務器函數的調用。
  
  4, 客戶樁(stub),有的書中翻譯成為代碼存根,它給客戶端程序提供一個樁,這個樁上"綁"著服務器對象。當客戶程序需要調用遠程對象時,這個樁被下載到客戶端(假如客戶端有這個類,則不需要下載)。然後客戶就可以像調用本地方法一樣調用遠程的方法了。
  
  這個客戶樁的作用是將客戶向服務器的請求進行編碼、進行傳輸,服務器執行這次調用後將結果返回到客戶樁,客戶樁進行解碼,將解碼後的結果傳送到客戶程序中。對於編寫客戶端的程序員來說,他不需要知道其中的具體過程。
  
  客戶樁不需要自己編寫,後面會說明它的生成方法。它實現了前述的接口(interface)。
  
  下面就通過一個例子來說明編寫的過程。
  
  1, 編寫服務器的接口:這一步是最主要的部分,因為接口是連接客戶機與服務器的要害部分。在這個例子中,接口很簡單,代碼如下:
  
   import Java.rmi.*;
  public interface ProdUCt extends Remote
  {
   String getDescription() throws RemoteException;
  }
  在這裡應注重的是,遠程對象的接口一定要擴展(extend)Java.rmi包的Remote接口。同時接口中的所有的方法都要聲明拋出RemoteException異常。這是因為由於網絡連接的不可靠性,遠程方法調用很可能失敗。假如不聲明異常,在遠程方法調用失敗後,應用程序就會無法結束。進入討論組討論。
  2, 編寫服務器對象:
  
  Java中具有一個可以直接使用的服務器類--UniCastRemoteObject。它存在於Java.rmi.server包中。我們可以直接擴展這個類,使它實現前述的接口。這樣就可以使服務器滿足我們的需要。
  
   import java.rmi.server.*;
  import java.rmi.*;
  public class ProductImpl extends UnicastRemoteObject implements Product
  {
   public ProductImpl(String name) throws RemoteException
   {
  Desc = name;
   }
   public String getDescription() throws RemoteException
   {
  return "This is "+Desc+" product";
   }
   private String Desc;
  }
  可以看到,rmi服務器的實現和其他的方法代碼沒有什麼不同。
  
  3, 編寫創建服務器對象的服務器程序:
  
   import java.rmi.*;
  public class ProductServer
  {
   public static void main(String[] args)
   {
  try
  {
   System.out.println("Constructin Server implementations ....");
   ProductImpl p1 = new ProductImpl("toaster");
   ProductImpl p2 = new ProductImpl("microwave");
   System.out.println("Binding server implementations to registry");
   Naming.rebind("toaster",p1);
   Naming.rebind("microwave",p2);
   System.out.println("waiting for clients...");
  }catch(Exception e)
  {
   System.out.println("Error "+e);
  }
   }
  }
  通過代碼可以看到,這個服務器首先創建了兩個服務器對象。然後使用Naming.rebind()方法,將這個對象和一個名稱聯系(綁定)在一起。這個名稱就是客戶機查找服務器對象所使用的名稱。Naming是java.rmi包中的類。這個類的作用是建立一套查找對象的命名機制。通過它就可以將綁定在特定名稱上的對象找到。進入討論組討論。
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved