在 Java 中,遠程對象是實現遠程介面的類的執行個體, 遠程介面聲明每個要遠程調用的方法。在需要建立一個遠程對象的時候,我們通過傳遞一個介面來隱藏基層的實施細節,客戶通過介面控制代碼發送訊息即可。
遠程介面具有如下特點:
1) 遠程介面必須為public屬性。如果不這樣,除非用戶端與遠程介面在同一個包內,否則 當試圖裝入實現該遠程介面的遠程對象時,調用會得到錯誤結果。
2) 遠程介面必須擴充介面java.rmi.Remote。
3) 除與應用程式本身特定的例外之外,遠程介面中的每個方法都必須在自己的throws從句中 聲明java.rmi.RemoteException。(或RemoteException 的父類)。
4) 作為參數或傳回值傳遞的一個遠程對象(不管是直接,還是本機物件中嵌入)必須聲明為遠 程介面,而不應聲明為實施類。
例如:
1)建立遠程介面TestRemote.java,原始碼如下:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface TestRemote extends Remote {
public int add(int a, int b) throws RemoteException;
}
2)建立遠程介面的實作類別TestRemoteImpl.java,原始碼如下:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class TestRemoteImpl extends UnicastRemoteObject implements TestRemote {
protected TestRemoteImpl() throws RemoteException {
super();
}
public int add(int a, int b) throws RemoteException {
return a+b;
}
}
3)編寫伺服器端代碼Server.java,原始碼如下:
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class Server {
public static void main(String[] args) throws Exception {
try {
LocateRegistry.createRegistry(8808) ;
// 建立遠程對象
TestRemote testRemote = new TestRemoteImpl();
// 獎名稱綁定到對象
Naming.rebind("rmi://localhost:8808/server", testRemote);
System.out.println("RMI伺服器正在運行。。。。。。");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4)編寫用戶端代碼 Client.java,原始碼如下:
import java.rmi.Naming;
public class Client {
public static void main(String[] args) {
try {
String url = "rmi://localhost:8808/server";
TestRemote RmiObject = (TestRemote)Naming.lookup(url);
System.out.println(" 1 + 2 = " + RmiObject.add(1, 2) );
} catch (Exception exc) {
System.out.println("Error in lookup: " + exc.toString());
}
}
}
5)編譯原始碼:
javac Server.java
javac Client.java
6)為遠程對象實現建立根和幹:
要建立存根程式和骨架檔案,應以包含遠程對象實現的已編譯類包全名運行 rmic 編譯器。
存根(Stub)是遠程對象在用戶端的代理,它將RMI調用傳遞給伺服器端的骨架(Skeleton),後者負責將該調用傳遞給實際的遠程方法,
輸入如下:
rmic -d E:\rmi TestRemoteImpl
其中;E:\rmi是代碼儲存的位置。
7)運行伺服器端程式和用戶端程式:
java Server
java Client