国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

用RMI實(shí)現(xiàn)基于Java的分布式計算

2019-11-18 12:42:09
字體:
供稿:網(wǎng)友

  java 2 EnterPRise Edition(J2EE)遠(yuǎn)程方法調(diào)用(Remote Method Invocation,RMI)框架答應(yīng)你創(chuàng)建透明的、分布式的服務(wù)和應(yīng)用程序。基于RMI的應(yīng)用程序由Java對象構(gòu)成,這些對象相互調(diào)用,同時忽略對方的位置。換言之,一個Java對象可調(diào)用另一個虛擬機(jī)上的某個Java對象的方法,整個過程和調(diào)用同一個虛擬機(jī)上的某個Java對象的方法無異。
  
  駐留在不同虛擬機(jī)上的對象為了相互獲得引用,可以使用RMI的查找服務(wù),或者將對象引用作為方法調(diào)用的一個參數(shù)或者返回值來接收。參數(shù)和返回值借助Java的對象序列化機(jī)制由RMI來進(jìn)行封送。
  
  遠(yuǎn)程對象和接口
  Java提供了一個完全限定名稱為java.rmi.Remote的接口。任何對象要想?yún)⑴c和另一個Java對象的遠(yuǎn)程會話,就必須直接或間接地實(shí)現(xiàn)該接口。尤其要注重的是,任何由java.rmi.Remote接口來標(biāo)識的對象都暗示著它的方法可從其他任何虛擬機(jī)進(jìn)行調(diào)用。實(shí)現(xiàn)了java.rmi.Remote接口的對象通常稱為“遠(yuǎn)程對象”,必須采用以下方式來聲明它的方法:
  
  每個支持遠(yuǎn)程調(diào)用的方法都必須在其throws子句中聲明java.rmi.RemoteException。
  對于一個可遠(yuǎn)程調(diào)用的方法,它的每個非基本(nonprimitive)參數(shù)或者返回值都必須直接或間接地聲明為實(shí)現(xiàn)了java.io.Serializable接口。
  除了實(shí)現(xiàn)java.rmi.Remote接口和正確聲明任何遠(yuǎn)程方法之外,遠(yuǎn)程對象必須提供一個無參數(shù)的構(gòu)造函數(shù),它能引發(fā)一個java.rmi.RemoteException異常。這就保證了對象可基于一種序列化狀態(tài)來遠(yuǎn)程構(gòu)造。
  
  遠(yuǎn)程對象必須導(dǎo)出,以接收傳入的遠(yuǎn)程方法調(diào)用。為此,你通常需要擴(kuò)展java.rmi.server.UnicastRemoteObject或者java.rmi.activation.Activatable。通過對其中任何一個類進(jìn)行擴(kuò)展,遠(yuǎn)程對象就可在創(chuàng)建時自動導(dǎo)出。
  
  以下接口定義展示了java.rmi.Remote接口最典型的用法:
  
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  public interface TimeKeeper extends Remote
  {
   public String currentDate() throws RemoteException;
   public String currentTime() throws RemoteException;
  }
  
  由于String類聲明為實(shí)現(xiàn)了java.io.Serializable接口,所以String是遠(yuǎn)程方法的有效返回類型。
  
  以下代碼展示了如何實(shí)現(xiàn)TimeKeeper接口,以便定義一個有效的遠(yuǎn)程對象:
  
  import java.rmi.RemoteException;
  import java.util.Calendar;
  import java.util.GregorianCalendar;
  public class TimeKeeperImpl implements TimeKeeper
  {
   public TimeKeeperImpl()
   throws RemoteException
   {
   }
   public String currentDate() throws RemoteException
   {
   Calendar cal = new GregorianCalendar();
   String retVal = (cal.get(Calendar.MONTH) + "/" +
     cal.get(Calendar.DAY_OF_MONTH) + "/" +
     cal.get(Calendar.YEAR));
   return retVal;
   }
   public String currentTime() throws RemoteException
   {
   Calendar cal = new GregorianCalendar();
   String retVal = (cal.get(Calendar.HOUR_OF_DAY) + ":" +
     cal.get(Calendar.MINUTE) + ":" +
     cal.get(Calendar.SECOND));
   return retVal;
   }
  }
  RMI注冊表
  為了獲取對遠(yuǎn)程對象的引用,RMI提供了名為注冊表(registry)的一個遠(yuǎn)程對象,它將名稱與遠(yuǎn)程對象關(guān)聯(lián)起來。RMI服務(wù)器要向注冊表注冊每一個遠(yuǎn)程對象,以便定位和檢索對象。RMI客戶端希望調(diào)用遠(yuǎn)程對象上的一個方法時,首先必須根據(jù)遠(yuǎn)程對象的名稱在注冊表中定位遠(yuǎn)程對象。假如遠(yuǎn)程對象存在,注冊表就返回對那個對象的一個引用。然后,要使用這個引用來發(fā)出對遠(yuǎn)程對象的方法調(diào)用。
  
  RMI服務(wù)器
  RMI采取一種客戶機(jī)/服務(wù)器結(jié)構(gòu)進(jìn)行通信。這意味著在RMI會話的某一端,必須有一個對象充當(dāng)服務(wù)器,另一端的對象則充當(dāng)客戶端。RMI服務(wù)器負(fù)責(zé)創(chuàng)建每個遠(yuǎn)程對象的實(shí)例,并將每個實(shí)例和RMI注冊表中的一個名稱綁定起來。RMI服務(wù)器可以自主,這要求它實(shí)現(xiàn)一個main方法,避免必須依靠其他類才能執(zhí)行。
  
  由于RMI服務(wù)器可從幾乎任何主機(jī)下載和執(zhí)行代碼,所以每個RMI服務(wù)器的main方法都需要安裝一個安全治理器,防止它所加載的類表現(xiàn)失常。下例展示了如何實(shí)例化一個安全治理器,以及如何在RMI注冊表中綁定一個對象實(shí)例:
  
  import java.rmi.RMISecurityManager;
  import java.rmi.Naming;
  public class SimpleRMIServer
  {
   public static void main(String[] args)
   {
   if (System.getSecurityManager() == null)
   {
   System.setSecurityManager(new RMISecurityManager());
   }
   try
   {
   TimeKeeperImplremoteObj = new TimeKeeperImpl();
   // Bind the remote object to the name "TimeKeeper"
   Naming.bind("http://HostName/TimeKeeper", remoteObj);
   System.out.println("TimeKeeper sUCcessfully bound in registry");
   }
   catch (Exception e)
   {
   System.err.println("Error binding TimeKeeper: " + e.getMessage());
   }
   }
  }
  小結(jié)
  本文簡單介紹了如何用RMI來隱藏遠(yuǎn)程交互問題,使程序員能將注重力集中在其他更重要的問題上,而不必過多地考慮通信基礎(chǔ)結(jié)構(gòu)。下一篇文章將進(jìn)一步探索RMI,講解RMI客戶端如何定位遠(yuǎn)程對象,并調(diào)用其上的方法。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沂源县| 祥云县| 虹口区| 鹤壁市| 凤庆县| 陆川县| 进贤县| 永清县| 江陵县| 兴宁市| 彩票| 甘泉县| 张家口市| 同江市| 磐安县| 奈曼旗| 河津市| 英德市| 卢龙县| 枣阳市| 微博| 九龙县| 新巴尔虎左旗| 永新县| 卓尼县| 全南县| 明水县| 南汇区| 建德市| 安图县| 武夷山市| 阳江市| 莱西市| 平安县| 桓台县| 安康市| 江孜县| 榆中县| 探索| 江孜县| 罗平县|