1. 定義遠(yuǎn)程接口
// 遠(yuǎn)程接口繼承自Remote
// 遠(yuǎn)程方法的傳入?yún)?shù)和返回值必須是自然類型(int,float,boolean等)
// 或者實現(xiàn)了Serializable或Remote接口的對象。
public interface Time extends java.rmi.Remote {
// 遠(yuǎn)程方法必須拋出RemoteException:
public String getTime() throws RemoteException;
}
2. 定義實現(xiàn)類
// 注意:實現(xiàn)類繼承自UnicastRemoteObject和自定義的遠(yuǎn)程接口Time:
public class TimeImpl extends java.rmi.server.UnicastRemoteObject implements Time {
// 注意:由于RemoteObject構(gòu)造函數(shù)要拋出RemoteException,
// 因此務(wù)必定義構(gòu)造函數(shù)并拋出RemoteException:
public TimeImpl() throws RemoteException { super(); }
// 這里是遠(yuǎn)程方法:
public String getTime() throws RemoteException {
return "12:04:27";
}
// 啟動服務(wù):
public static void main(String[] args) throws Exception {
// 可以手動啟動RMI Registry,也可以在程序中啟動:
java.rmi.registry.LocateRegistry.createRegistry(1099);
// 綁定名字服務(wù),地址是本地計算機名或本機IP,默認(rèn)端口是1099:
java.rmi.Naming.bind("http://localhost:1099/servicename", new TimeImpl());
// 如果沒有異常拋出,則綁定成功。
// 如果名字已經(jīng)被綁定,可以用Naming.rebind()替換掉已綁定的服務(wù)。
}
}
3. 編譯生成樁和框架
運行rmic TimeImpl,生成TimeImpl_Skel.class和TimeImpl_Stub.class。
4. 客戶端
// 客戶端文件包含客戶端代碼Client.class,遠(yuǎn)程接口Time.class,
// 由rmic生成的支持類TimeImpl_Skel.class和TimeImpl_Stub.class:
public static void main(String[] args) throws Exception {
// 客戶端通過IP引用服務(wù)器端的遠(yuǎn)程對象,因此可以動態(tài)選擇服務(wù)器。
// 如果不指定端口,默認(rèn)端口號是1099:
Time time = (Time)java.rmi.Naming.lookup("http://localhost:1099/servicename");
System.out.println(time.getTime());
}