RMI遠程方法調用講解教程
1、RMI概述
RMI(Remote Method Invocation)
RMI是分布式對象軟件包,它簡化了在多台計算機上的JAVA應用之間的通信。
必須在jdk1.1以上
RMI用到的類
java.rmi.Remote
所有可以被遠程調用的對象都必須實現該接口
java.rmi.server.UnicastRemoteObject
所有可以被遠程調用的對象都必須擴展該類
什麼是RMI
遠程方法調用是一種計算機之間對象互相調用對方函數,啟動對方進程的一 種機制,使用這種機制,某一台計算機上的對象在調用另外一台計算機上的方法 時,使用的程
序語法規則和在本地機上對象間的方法調用的語法規則一樣。
優點
這種機制給分布計算的系統設計、編程都帶來了極大的方便。
只要按照RMI規則設計程序,可以不必再過問在RMI之下的網絡細節了,如: TCP和Socket等等。
任意兩台計算機之間的通訊完全由RMI負責。調用遠程計算機上的對象就像本 地對象一樣方便。
1、面向對象:
RMI可將完整的對象作為參數和返回值進行傳遞,而不僅僅是預定義的數據類 型。
也就是說,可以將類似Java哈西表這樣的復雜類型作為一個參數進行傳遞。
2、可移動屬性:
RMI可將屬性從客戶機移動到服務器,或者從服務器移動到客戶機。
3、設計方式:
對象傳遞功能使您可以在分布式計算中充分利用面向對象技術的強大功能, 如二層和三層結構系統。
如果用戶能夠傳遞屬性,那麼就可以在自己的解決方案中使用面向對象的設 計方式。
所有面向對象的設計方式無不依靠不同的屬性來發揮功能,如果不能傳遞完 整的對象——包括實現和類型
——就會失去設計方式上所提供的優點。
4、安全性:
RMI使用Java內置的安全機制保證下載執行程序時用戶系統的安全。
RMI使用專門為保護系統免遭惡意小程序侵害而設計的安全管理程序。
5、便於編寫和使用
RMI使得Java遠程服務程序和訪問這些服務程序的Java客戶程序的編寫工作變 得輕松、簡單。
遠程接口實際上就是Java接口。
為了實現RMI的功能必須創建遠程對象任何可以被遠程調用的對象必須實現遠 程接口。但遠程
接口本身並不包含任何方法。因而需要創建一個新的接口來擴展遠程接口。
新接口將包含所有可以遠程調用的方法。遠程對象必須實現這個新接口,由 於新的接口擴展了
遠程接口,實現了新接口,就滿足了遠程對象對實現遠程接口的要求,所實 現的每個對象都將
作為遠程對象引用。
創建遠程方法調用的5個步驟:
1、定義一個遠程接口的接口,該接口中的每一個方法必須聲明它將產生一個 RemoteException異常。
2、定義一個實現該接口的類。
3、使用RMIC程序生成遠程實現所需的殘根和框架。
4、創建一個客戶程序和服務器進行RMI調用。
5、啟動Registry並運行自己的遠程服務器和客戶程序。
第一步、擴展遠程接口
創建一個RMI程序首先要做的就是創建一個擴展遠程接口的接口。在這個接口 中可以添加任意希望能在
遠程機器上調用的方法。
接口示例
import java.rmi.Remote;
import.java.rmi.RemoteException;
public interface RemoteInterface extends java.rmi.Remote
{
public String start(String msg) throws RemoteException;
}
在接口中定義了一個返回字符串的方法
本地接口(RemoteInterface)必須是公共的,否則客戶機在加載一個實現該接 口的遠程對象時就會出錯。
它必須從java.rmi.Remote繼承而來,接口中的每一個方法都必須拋出遠程異 常java.rmi.RemoteException。
拋出這個異常的原因
由於任何遠程方法調用實際上要進行許多低級網絡操作,因此網絡錯誤可能 在調用過程中隨時發生。
因此,所有的RMI操作都應放到try-catch塊中。
第二步、定義一個實現該接口的類。
該類必須繼承UnicastRemoteObject類。
擴展java.rmi.server.UnicastRemoteObject
UnicastRemoteObject顧名思義,是讓客戶機與服務器對象實例建立一對一的 連接。
擴展實現接口的類例程
服務器關鍵語句
Naming.rebind("/RMITest",rmiTest);
//名字和接口綁定
第三步、生成殘根和框架代碼
在RMI中,客戶機上生成的調動調用參數和反調動返回值的代碼稱為殘根。有 的書上稱這部分代碼為“主干”。
服務器上生成的反調動調用參數和進行實際方法調用調動返回值的代碼稱為 框架。
生成殘根和框架的工具
Rmic命令行工具(RMI Compiler)
格式:
Rmic classname
第四步、創建一個客戶程序進行RMI調用
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
public class RemoteClientTest{
static RemoteInterface gserver=null;
void display(){
try{//查找遠程對象
gserver=(RemoteInterface)Naming.lookup("//localhost/RMITest");
String msg=gserver.start();
System.out.println("服務器返回信息:"+msg);}
catch (Exception e1) {System.out.println(e1);}
}
public static void main (String[] args){
RemoteClientTest app=new RemoteClientTest();
app.display();}
}
客戶端端關鍵語句
gserver=(RemoteInterface)Naming.lookup("//localhost/RMITest");
//查找遠程對象
第五步、用RmiRegistry找到遠程對象
這是一個使用工具,維護文本名和遠程對象之間的映射,可以進行遠程訪問 。
文章來源:http://useway.blog.51cto.com/736087/149172