遠程方法調用

遠程方法調用

Raza Microelectronics, Inc.(RMI公司)是勇於創新的信息基礎架構半導體解決方案領導廠商,其產品廣泛地被套用於改善不斷演進的信息基礎設施。在這個演進過程中,數據中心和家庭之間的連線在強度和速率方面都逐漸升級;安全和智慧型化已經成為每一個網路系統環境的要求;同時,邊緣網路日益成為瓶頸,促使業界需要更具擴展能力及成本優勢的智慧型網路接入方法。RMI公司為信息基礎架構設計並提供多樣化的解決方案,為下一代靈活的企業和數據中心套用、智慧型接入和數字影像系統奠定基礎。

基本信息

公司介紹

背景介紹

RMI 總部位於美國加州的庫比提諾 (Cupertino) 市。RMI子公司負責運營其在中國,印度和日本的發展中心以及代表處。RMI在中國的兩個全資子公司位於北京和深圳(總稱,RMI中國)。

產品

RMI公司為信息基礎設施提供一系列新一代半導體解決方案。

XLR™執行緒處理器(Thread Processor™)系列

基於MIPS64®的XLR處理器系列是全球首款為企業和數據中心關聯計算(Connected Computing)套用而設計的執行緒處理器 (Thread Processor™)。XLR系列處理器是目前功能最強大、吞吐量最最佳化的處理器解決方案。

XLR系列是基於RMI增強型MIPS64™核心,同時支持32個執行緒的獨特構架的處理器,目前工作頻率可達1.5GHz,同時支持高度集成的獨立硬體安全引擎和網路套用加速器。安全、內容感知和智慧型套用對網路和計算的套用變得日益重要,而XLR系列處理器正是為了滿足這些套用不斷融合的主要推動器。這些套用包括集成安全 (防火牆、VPN、防病毒、入侵防禦)、Web服務、虛擬存儲、負載平衡、伺服器卸載、智慧型路由與交換等。

XL™處理器系列

基於MIPS64®的XL處理器系列為數字影像套用帶來了低功耗的處理器解決方案。業界領先的性價比和低功耗特性,使XL處理器系列成為針對辦公室自動化和數位化娛樂市場理想的嵌入式處理器。

Orion™智慧型接入(Intelligent Access™)處理器系列

Orion智慧型接入處理器系列是目前集成度最高、配備服務質量保證(QoS)的EOS方案。Orion系列產品提供運營商級的解決方案,協助運營商基於現有通訊網路設施提供以乙太網型式接入的多類型服務。

Pegasus™ PDH接入處理器系列

Pegasus系列PDH接入處理器為多類要求T1/E1/J1及T3/E3支援的接入套用提供了一個靈活的解決方案。Pegasus通過直接連線SONET/SDH或數據接口來支持Ethernet-Over-DS3套用。

優異的半導體產品執行能力

RMI公司擁有的電子工程設計專才使其可以快速地開發先進的半導體產品,不斷提升處理器性能和集成度。作為一家具優異產品執行力的晶片廠商,RMI公司獨一無二的快速提供重塑市場革命性產品的能力可使系統製造商作出對常變的市場需求做出快速反應:

· 通過 “單晶片系統” (System-On-a-Chip) 設計方法,提供更高的集成度和更豐富的功能

· 簡化產品套用開發,幫助廠商快速地回響市場需求

· 最佳化產品成本,協助廠商輕鬆面對具有價格彈性的市場

· 為廠商開啟新市場、新服務之大門

RMI團隊:人才+ 經驗 = 成功

RMI公司由世界級的架構師團隊和具有豐富經驗的管理團隊創立,由執行長Atiq Raza先生領導。Raza先生是享譽世界、深受尊敬的半導體行業泰斗,他在三十三年的職業歷程中為新一代處理器的革新做出了卓越的貢獻。

RMI公司採取積極的研發模式,其精幹的研發隊伍由最優秀的架構師和工程師組成。RMI公司具有快速提供重塑市場的革命性產品的能力,使得系統製造商能夠對常變的市場需求做出快速反應。這個團隊利用本身在半導體和系統製造行業廣泛的產品開發及豐富的商業領導經驗,使得RMI公司從一家概念性的新公司,快速成長為成功的高科技公司。

製造

RMI公司與其緊密合作的製造夥伴都完全遵守嚴格的質量標準,保證其產品供應的連續性及可靠性。通過採用標準的CMOS生產技術,RMI公司將產品生產外發給世界一流的具擁有大量先進半導體生產技術的晶圓製造商夥伴,通過大幅度的降低成本及對資源的戰略性運用,成功地發揮了無晶圓半導體產品廠商的戰略性優勢。

沿革

2009年6月,NetLogic宣布收購RMI公司。

2011年9月,博通收購了NetLogic公司。

RMI總裁背景

Atiq Raza

主席兼執行長

Atiq Raza是RMI公司的創立者、主席兼執行長。

在創立RMI公司之前,Raza先生曾擔任Advanced Micro Devices (AMD)的總裁兼首席運營長官,期間為AMD處理器產品的發展規劃制定了基礎,並成功推出AMD-K6和Athlon系列處理器。

1996年1月,AMD和NexGen公司合併,Raza成為AMD管理層成員, 並任董事。在合併前,Raza先生是當時NexGen公司的主席兼執行長。

Raza先生還是Matrix Semiconductors、AMI Semiconductor、Mellanox Technologies, Inc.、eASIC和TRG的董事會成員。

RMI公司由世界級的架構師團隊和具有豐富經驗的管理團隊創立,由執行長Atiq Raza先生領導。Raza先生是享譽世界、深受尊敬的半導體行業泰斗,他在三十三年的職業歷程中為新一代處理器的革新做出了卓越的貢獻。

RMI公司採取積極的研發模式,其精幹的研發隊伍由最優秀的架構師和工程師組成。RMI公司具有快速提供重塑市場的革命性產品的能力,使得系統製造商對常變的市場需求能夠做出快速反應。這個團隊利用本身在半導體和系統製造行業廣泛的產品開發及豐富的商業領導經驗,使得RMI公司從一家概念性的新公司,快速成長為成功的高科技公司。

RMI在中國的全資子公司位於深圳,北京等地(總稱:RMI中國),使得RMI公司可以為客戶提供很好的研發協助和技術支持。

RMI中國團隊

RMI公司的中國團隊是在中國獨樹一幟的支持團隊。團隊成員全部由具有多年研發經驗的高級工程師組成,團隊成員對MIPS,PowerPC,IXP2400/2800等處理器及其套用,以及各種作業系統如VxWorks,Linux有著豐富的經驗。與其他晶片供應商在中國的技術支持團隊相比,RMI的中國團隊更像是一支研發隊伍,而不僅僅完成技術支持的工作。在與國內領先的通訊設備製造商的合作中,RMI團隊的工作能力得到了極高的評價,從不同客戶那裡傳來的聲音都表示:RMI中國團隊的技術支持工作非常高效,及時。尤其在幫助客戶把RMI產品集成到客戶自己的系統和網路當中方面做的很好。RMI中國團隊可以真正做到幫助客戶快速搭建開發平台,高效的解決技術問題,並在系統設計方面給出建設性意見,從而幫助客戶大大提高工作效率,縮短產品的研發周期。

方法調用

相關概述

RMI是Java的一組擁護開發分散式應用程式的API。RMI使用Java語言接口定義了遠程對象,它集合了Java序列化和Java遠程方法協定(Java Remote Method Protocol)。簡單地說,這樣使原先的程式在同一作業系統的方法調用,變成了不同作業系統之間程式的方法調用,由於J2EE是分散式程式平台,它以RMI機制實現程式組件在不同作業系統之間的通信。比如,一個EJB可以通過RMI調用Web上另一台機器上的EJB遠程方法。

RMI(Remote Method Invocation,遠程方法調用)是用Java在JDK1.1中實現的,它大大增強了Java開發分散式套用的能力。Java作為一種風靡一時的網路開發語言,其巨大的威力就體現在它強大的開發分散式網路套用的能力上,而RMI就是開發百分之百純Java的網路分散式套用系統的核心解決方案之一。其實它可以被看作是RPC的Java版本。但是傳統RPC並不能很好地套用於分散式對象系統。而Java RMI 則支持存儲於不同地址空間的程式級對象之間彼此進行通信,實現遠程對象之間的無縫遠程調用。

RMI目前使用Java遠程訊息交換協定JRMP(Java Remote Messaging Protocol)進行通信。JRMP是專為Java的遠程對象制定的協定。因此,Java RMI具有Java的“Write Once,Run Anywhere”的優點,是分散式套用系統的百分之百純Java解決方案。用Java RMI開發的套用系統可以部署在任何支持JRE(Java Run Environment Java,運行環境)的平台上。但由於JRMP是專為Java對象制定的,因此,RMI對於用非Java語言開發的套用系統的支持不足。不能與用非Java語言書寫的對象進行通信。

Java Remote Method Invocation ( RMI -- Java遠程方法調用)允許您使用Java編寫分散式對象。本文將介紹RMI的優點以及如何將其連線到現有的和原有的系統中,以及與用Java 編寫的組件的連線。

RMI為採用Java對象的分散式計算提供了簡單而直接的途徑。這些對象可以是新的Java對象,也可以是圍繞現有API的簡單的Java包裝程式。Java體現了“編寫一次就能在任何地方運行的模式。而RMI可將Java模式進行擴展,使之可在任何地方運行”。

因為RMI是以Java為核心的,所以,它將Java的安全性和可移植性等強大功能帶給了分散式計算。您可將代理和業務邏輯等屬性移動到網路中最合適的地方。如果您要擴展Java在系統中的使用,RMI將使您充分利用其強大功能。

RMI可利用標準Java本機方法接口JNI 與現有的和原有的系統相連線。RMI還可利用標準JDBC包與現有的關係資料庫連線。RMI/JNI和RMI/JDBC相結合,可幫助您利用RMI與目前使用非Java語言的現有伺服器進行通信,而且在您需要時可擴展Java在這些伺服器上的使用。RMI可幫助您在擴展使用時充分利用Java的強大功能。

RMI系統運行機理

RMI應用程式通常包括兩個獨立的程式:伺服器程式和客戶機程式。典型的伺服器應用程式將創建多個遠程對象,使這些遠程對象能夠被引用,然後等待客戶機調用這些遠程對象的方法。而典型的客戶機程式則從伺服器中得到一個或多個遠程對象的引用,然後調用遠程對象的方法。RMI為伺服器和客戶機進行通信和信息傳遞提供了一種機制。

在與遠程對象的通信過程中,RMI使用標準機制:stub和skeleton。遠程對象的stub擔當遠程對象的客戶本地代表或代理人角色。調用程式將調用本地stub的方法,而本地stub將負責執行對遠程對象的方法調用。在RMI中,遠程對象的stub與該遠程對象所實現的遠程接口集相同。調用stub的方法時將執行下列操作:

(1) 初始化與包含遠程對象的遠程虛擬機的連線;

(2) 對遠程虛擬機的參數進行編組(寫入並傳輸);

(3) 等待方法調用結果;

(4) 解編(讀取)返回值或返回的異常;

(5) 將值返回給調用程式。為了向調用程式展示比較簡單的調用機制,stub將參數的序列化和網路級通信等細節隱藏了起來。在遠程虛擬機中,每個遠程對象都可以有相應的skeleton(在JDK1.2環境中無需使用skeleton)。Skeleton負責將調用分配給實際的遠程對象實現。它在接收方法調用時執行下列操作:(1) 解編(讀取)遠程方法的參數;(2) 調用實際遠程對象實現上的方法;(3) 將結果(返回值或異常)編組(寫入並傳輸)給調用程式。stub和skeleton由rmic編譯器生成。

利用RMI編寫分散式對象應用程式需要完成以下工作:(1) 定位遠程對象。應用程式可使用兩種機制中的一種得到對遠程對象的引用。它既可用RMI的簡單命名工具rmiregistry來註冊它的遠程對象,也可以將遠程對象引用作為常規操作的一部分來進行傳遞和返回。(2)與遠程對象通信。遠程對象間通信的細節由RMI處理,對於程式設計師來說,遠程通信看起來就像標準的Java方法調用。(3)給作為參數或返回值傳遞的對象載入類位元組碼。因為RMI允許調用程式將純Java對象傳給遠程對象,所以,RMI將提供必要的機制,既可以載入對象的代碼又可以傳輸對象的數據。在RMI分散式應用程式運行時,伺服器調用註冊服務程式以使名字與遠程對象相關聯。客戶機在伺服器上的註冊服務程式中用遠程對象的名字查找該遠程對象,然後調用它的方法。

系統組成

一個正常工作的RMI系統由下面幾個部分組成:

·遠程服務的接口定義

·遠程服務接口的具體實現

·樁(Stub)和框架(Skeleton)檔案

·一個運行遠程服務的伺服器

·一個RMI命名服務,它允許客戶端去發現這個遠程服務

·類檔案的提供者(一個HTTP或者FTP伺服器)

·一個需要這個遠程服務的客戶端程式

技術原理

RMI系統結構,在客戶端和伺服器端都有幾層結構。

--------- ----------

| 客戶 | |伺服器|

---------- ----------

| |

------------- ----------

| 占位程式| |骨幹網|

-------------- -----------

| |

------------------------------------

| 遠 程 引 用 層 |

------------------------------------

| |

------------------------------------

| 傳 輸 層 |

------------------------------------

方法調用從客戶對象經占位程式(Stub)、遠程引用層(Remote Reference Layer)和傳輸層(Transport Layer)向下,傳遞給主機,然後再次經傳 輸層,向上穿過遠程調用層和骨幹網(Skeleton),到達伺服器對象。 占位程式扮演著遠程伺服器對象的代理的角色,使該對象可被客戶激活。 遠程引用層處理語義、管理單一或多重對象的通信,決定調用是應發往一個伺服器還是多個。傳輸層管理實際的連線,並且追追蹤可以接受方法調用的遠程對象。伺服器端的骨幹網完成對伺服器對象實際的方法調用,並獲取返回值。返回值向下經遠程引用層、伺服器端的傳輸層傳遞迴客戶端,再向上經傳輸層和遠程調用層返回。最後,占位程式獲得返回值。

要完成以上步驟需要有以下幾個步驟:

1、生成一個遠程接口

2、實現遠程對象(伺服器端程式)

3、生成占位程式和骨幹網(伺服器端程式)

4、編寫伺服器程式

5、編寫客戶程式

6、註冊遠程對象

7、啟動遠程對象

具體實現如下:

1、生成一個遠程接口

package c15.ptime;

importjava.rmi.*;

public interface PerfectTimeI extends Remote {

long getPerfectTime() throws RemoteException;

}

2、實現遠程對象(伺服器端程式)

package c15.ptime;

import java.rmi.*;

importjava.rmi.server.*;

importjava.rmi.registry.*;

import java. net.*;

public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI {

public long getPerfectTime() throws RemoteException {

return System.currentTimeMillis();

}

public PerfectTime() throws RemoteException {

super();

}

public static void main(String[] args) {

try {

PerfectTime pt = new PerfectTime();

LocateRegistry.createRegistry(2005);

Naming.rebind( "//zhouty:2005/PerfectTime" , pt);

System.out.println("Ready to do time");

} catch(Exception e) {

e.printStackTrace();

}

}

}

4、編譯遠程對象(伺服器端程式)

javac -classpath . -d . PerfectTime.java

5 、生成根和乾(占位程式和骨幹程式)

rmic -classpath . -d . c15.ptime.PerfectTime

註:jdk1.2以後的都不需要skeleton,所以如果你用的jdk為5.0版本的,

不要奇怪為什麼只產生了stub沒有skeleton。

6、註冊遠程對象

start rmiregistry 2005

註:綁定服務的默認連線埠為1099,如果使用了這個連線埠,則可以直接使用 start rmiregistry而不需要跟連線埠

如果這種註冊遠程對象的方法不起作用.

還有一種方法就是在綁定服務之前使用LocateRegistry.createRegistry(1099) 來註冊遠程對象.

7、啟動伺服器端程式

java-Djava.rmi.server.codebase=file:///d:/TestRMI/ c15.ptime.Per

fectTime

8、編寫客戶端程式

package c15.ptime;

import java.rmi.*;

importjava.rmi.registry.*;

public class DisplayPerfectTime {

public static void main(String[] args) {

System.setSecurityManager( new RMISecurityManager());

try {

PerfectTimeI t = (PerfectTimeI)Naming.lookup( "192.168.0.171:2005/PerfectTime");

for(int i = 0 ; i < 10; i++)

System.out.println("Perfect time =" +

t.getPerfectTime());

} catch(Exception e) {

e.printStackTrace();

}

}

}

9、編譯客端程式

javac -classpath . -d . DisplayPerfectTime.java

10、修改JVM的配置檔案 (客戶機和伺服器的都需要經過修改)

%JRE_HOME%\policytool.exe

11、啟動客戶程式

java -classpath . c15.ptime.DisplayPerfectTime

12、返回結果

Perfect time =967274884390

Perfect time =967274884450

Perfect time =967274884450

Perfect time =967274884450

Perfect time =967274884500

Perfect time =967274884500

Perfect time =967274884560

Perfect time =967274884610

Perfect time =967274884610

Perfect time =967274884610

RMI(遠程方法調用)的優點

從最基本的角度看,RMI是Java的遠程過程調用(RPC)機制。與傳統的RPC系統相比,RMI具有若干優點,因為它是Java面向對象方法的一部分。傳統的RPC系統採用中性語言,所以是最普通的系統--它們不能提供所有可能的目標平台所具有的功能。

RMI以Java為核心,可與採用本機方法與現有系統相連線。這就是說,RMI可採用自然、直接和功能全面的方式為您提供分散式計算技術,而這種技術可幫助您以不斷遞增和無縫的方式為整個系統添加Java功能。

RMI的主要優點如下:

面向對象:RMI可將完整的對象作為參數和返回值進行傳遞,而不僅僅是預定義的數據類型。也就是說,您可以將類似Java哈希表這樣的複雜類型作為一個參數進行傳遞。而在目前的RPC系統中,您只能依靠客戶機將此類對象分解成基本數據類型,然後傳遞這些數據類型,最後在伺服器端重新創建哈希表。RMI則不需額外的客戶程式代碼(將對象分解成基本數據類型),直接跨網傳遞對象。

可移動屬性:RMI可將屬性(類實現程式)從客戶機移動到伺服器,或者從伺服器移到客戶機。例如,您可以定義一個檢查雇員開支報告的接口,以便察看雇員是否遵守了公司目前實行的政策。在開支報告創建後,客戶機就會從伺服器端獲得實現該接口的對象。如果政策發生變化,伺服器端就會開始返回使用了新政策的該接口的另一個實現程式。您不必在用戶系統上安裝任何新的軟體就能在客戶端檢查限制條件--從而向用戶提供爍快的反饋,並降低伺服器的工作量。這樣就能具備最大的靈活性,因為政策改變時只需要您編寫一個新的Java類,並將其在伺服器主機上安裝一次即可。

設計方式:對象傳遞功能使您可以在分散式計算中充分利用面向對象技術的強大功能,如二層和三層結構系統。如果您能夠傳遞屬性,那么您就可以在您的解決方案中使用面向對象的設計方式。所有面向對象的設計方式無不依靠不同的屬性來發揮功能,如果不能傳遞完整的對象--包括實現和類型--就會失去設計方式上所提供的優點。

安 全:RMI使用Java內置的安全機制保證下載執行程式時用戶系統的安全。RMI使用專門為保護系統免遭惡意小應用程式侵害而設計的安全管理程式,可保護您的系統和網路免遭潛在的惡意下載程式的破壞。在情況嚴重時,伺服器可拒絕下載任何執行程式。

便於編寫和使用:RMI使得Java遠程服務程式和訪問這些服務程式的Java客戶程式的編寫工作變得輕鬆、簡單。遠程接口實際上就是Java接口。服務程式大約用三行指令宣布本身是服務程式,其它方面則與任何其它Java對象類似。這種簡單方法便於快速編寫完整的分散式對象系統的服務程式,並快速地製做軟體的原型和早期版本,以便於進行測試和評估。因為RMI程式編寫簡單,所以維護也簡單。

可連線現有/原有的系統:RMI可通過Java的本機方法接口JNI與現有系統進行進行互動。利用RMI和JNI,您就能用Java語言編寫客戶端程式,還能使用現有的伺服器端程式。在使用RMI/JNI與現有伺服器連線時,您可以有選擇地用Java重新編寫服務程式的任何部分,並使新的程式充分發揮Java的功能。類似地,RMI可利用JDBC、在不修改使用資料庫的現有非Java原始碼的前提下與現有關係資料庫進行互動。

編寫一次,到處運行:RMI是Java“編寫一次,到處運行 ”方法的一部分。任何基於RMI的系統均可100%地移植到任何Java虛擬機上,RMI/JDBC系統也不例外。如果使用RMI/JNI與現有系統進行互動工作,則採用JNI編寫的代碼可與任何Java虛擬機進行編譯、運行。

分散式垃圾收集:RMI採用其分散式垃圾收集功能收集不再被網路中任何客戶程式所引用的遠程服務對象。與Java虛擬機內部的垃圾收集類似,分散式垃圾收集功能允許用戶根據自己的需要定義伺服器對象,並且明確這些對象在不再被客戶機引用時會被刪除。

並行計算:RMI採用多執行緒處理方法,可使您的伺服器利用這些Java執行緒更好地並行處理客戶端的請求。Java分散式計算解決方案:RMI從JDK 1.1開始就是Java平台的核心部分,因此,它存在於任何一台1.1 Java虛擬機中。所有RMI系統均採用相同的公開協定,所以,所有Java 系統均可直接相互對話,而不必事先對協定進行轉換。

RMI與CORBA的關係

RMI 和 CORBA 常被視為相互競爭的技術,因為兩者都提供對遠程分散式對象的透明訪問。但這兩種技術實際上是相互補充的,一者的長處正好可以彌補另一者的短處。RMI 和 CORBA 的結合產生了RMI-IIOP,RMI-IIOP 是企業伺服器端 Java 開發的基礎。

1997 年,IBM 和 Sun Microsystems啟動了一項旨在促進 Java 作為企業開發技術的發展的合作計畫。兩家公司特別著力於如何將 Java 用作伺服器端語言,生成可以結合進現有體系結構的企業級代碼。所需要的就是一種遠程傳輸技術,它兼有 Java 的 RMI(Remote Method Invocation,遠程方法調用)較少的資源占用量和更成熟的 CORBA(Common Object Request Broker Architecture,公共對象請求代理體系結構)技術的健壯性。出於這一需要,RMI-IIOP問世了,它幫助將 Java 語言推向了目前伺服器端企業開發的主流語言的領先地位。

RMI示例

Java遠程方法調用(RMI)提供了Java程式語言的遠程通訊功能,這種特性使客戶機上運行的程式可以調用遠程伺服器上的對象,使Java編程人員能夠在網路環境中分布操作。

創建一個簡單的Java分散式遠程方法調用程式可以按以下幾個步驟操作,

一、定義遠程接口:

在 Java 中,遠程對象是實現遠程接口的類的實例, 遠程接口聲明每個要遠程調用的方法。在需要創建一個遠程對象的時候,我們通過傳遞一個接口來隱藏基層的實施細節,客戶通過接口句柄傳送訊息即可。

遠程接口具有如下特點:

1) 遠程接口必須為public屬性。如果不這樣,除非客戶端與遠程接口在同一個包內,否則 當試圖裝入實現該遠程接口的遠程對象時,調用會得到錯誤結果。

2) 遠程接口必須擴展接口java.rmi.Remote。

3) 除與應用程式本身特定的例外之外,遠程接口中的每個方法都必須在自己的throws從句中 聲明java.rmi.RemoteException。(或RemoteException 的父類)。

4) 作為參數或返回值傳遞的一個遠程對象(不管是直接,還是本地對象中嵌入)必須聲明為遠 程接口,而不應聲明為實施類。

下面是遠程接口的接口RmiSample的定義

Java代碼

import java.rmi.*; public interface RmiSample extends Remote { public int sum(int a,int b) throws RemoteException; }

二、實現遠程接口:

遠程對象實現類必須擴展遠程對象java.rmi.UnicastRemoteObject類,並實現所定義的遠程接口。遠程對象的實現類中包含實現每個遠程接口所指定的遠程方法的代碼。這個類也可以含有附加的方法,但客戶只能使用遠程接口中的方法。因為客戶是指向接口的一個句柄,而不是它的哪個類。必須為遠程對象定義構造函式,即使只準備定義一個默認構造函式,用它調用基礎類構造函式。因為基礎類構造函式可能會拋出java.rmi.RemoteException,所以即使別無它用必須拋出java.rmi.RemoteException例外。

以下是遠程對象實現類的聲明:

Java代碼

import java.rmi.*;

importjava.rmi.server.*;

public class RmiSampleImpl extends UnicastRemoteObject implements RmiSample {

RmiSampleImpl() throws RemoteException {

super();

}

public int sum(int a,int b) throws RemoteException {

return a + b;

}

}

三、編寫伺服器類:

包含 main 方法的類可以是實現類自身,也可以完全是另一個類。下面通過RmiSampleServer 來創建一個遠程對象的實例,並通過java.rmi.registry.LocateRegistry類的createRegistry 方法從指定連線埠號啟動註冊服務程式,也可以通過執行 rmiregistry 命令啟動註冊服務程式,註冊服務程式的預設運行連線埠為 1099。必須將遠程對象名字綁定到對遠程對象的引用上:Naming.rebind("//localhost:8808/SAMPLE-SERVER" , Server);

以下是伺服器類的聲明:

Java代碼

import java.rmi.*;

import java.rmi.registry.*;

public class RmiSampleServer{

public static void main(String args[]) {

try {

LocateRegistry.createRegistry(8808) ;

SampleServerImpl Server = new SampleServerImpl();

// 將該對象實例與名稱“SAMPLE-SERVER”捆綁

Naming.rebind("//localhost:8808/SAMPLE-SERVER" , Server);

} catch (MalformedURLException me) {

System.out.println("Malformed URL: " + me.toString());

} catch (RemoteException re) {

System.out.println("Remote exception: " + re.toString());

}

}

}

四、編寫使用遠程服務的客戶機類:

客戶機類的主要功能有兩個,一是通過Naming.lookup方法來構造註冊服務程式stub 程式實例,二是調用伺服器遠程對象上的遠程方法。

以下是伺服器類的聲明:

Java代碼

import java.rmi.*;

importjava.rmi.server.*;

public class RmiSampleClient { public static void main(String[] args) {

try {

String url = "//localhost:8808/SAMPLE-SERVER";

RmiSample RmiObject = (RmiSample)Naming.lookup(url);

System.out.println(" 1 + 2 = " + RmiObject.sum(1,2) );

} catch (RemoteException exc) {

System.out.println("Error in lookup: " + exc.toString());

} catch (MalformedURLException exc) {

System.out.println("Malformed URL: " + exc.toString());

} catch (java.rmi.NotBoundException exc) {

System.out.println("NotBound: " + exc.toString());

}

}

}

五、編譯代碼:

要編譯 Java 源檔案,請運行javac 命令:

Java代碼

javac RmiSample.java RmiSampleImpl.java RmiSampleServer.java RmiSampleClient.java

javac RmiSample.java RmiSampleImpl.java RmiSampleServer.java RmiSampleClient.java

六、為遠程對象實現創建根和乾:

要創建存根程式和骨架檔案,應以包含遠程對象實現的已編譯類包全名運行 rmic編譯器。

存根(Stub)是遠程對象在客戶端的代理,它將RMI調用傳遞給伺服器端的骨架(Skeleton),後者負責將該調用傳遞給實際的遠程方法輸入如下:

Java代碼

D:\RMI>rmic -d D:\RMI RmiSampleImpl

D:\RMI>rmic -d D:\RMI RmiSampleImpl 執行這個命令, 若rmic成功運行,RMI目錄下就會多出兩個新類: RmiSampleImpl_Stub.class RmiSampleImpl_Skel.class 它們分別對應的是存根(stub)和骨架(skeleton).

七、運行代碼:

運行服務端程式:在Windows下,輸入下列命令,在後台啟動RmiSampleServer程式:

Java代碼

D:\RMI>java RmiSampleServer

D:\RMI>java RmiSampleServer

運行客戶端程式:

Java代碼

D:\RMI>java RmiSampleClient

D:\RMI>java RmiSampleClient

客戶端輸出: 1 + 2 = 3

RMI(Retailer Managed Inventory)零售商管理庫存 RMI(Retailer Managed Inventory,RMI),零售商管理庫存。是一種傳統的庫存管理方法,相對於VMI(Vendor Managed Inventory,供應商管理庫存)而言,由零售商根據自己的銷售需要來控制管理庫存。

指示器介紹

radio magnetic indicator

無線電磁指示器(RMI)是一種備用儀表,通過無線電磁指示器,可以指示VOR台與ADF台的相對位置,也可以指示飛機的磁航向。

相關詞條

相關搜尋

熱門詞條

聯絡我們