下面我將介紹一個完整的實例,讓初學者能快速體驗RMI的功用。
分爲以下四個步驟
1. 創建遠程接口及聲明遠程方法(HelloInterface.java)
2. 實現遠程接口及遠程方法(繼承UnicastRemoteObject)(Hello.java)
3. 啓動RMI註冊服務,並註冊遠程對象(HelloServer.java)
4. 客戶端查找遠程對象,並調用遠程方法(HelloClient)
5. 執行程序:啓動服務HelloServer;運行客戶端HelloClient進行調用
具體代碼及對應步驟如下:
1. 創建遠程接口及聲明遠程方法(HelloInterface.java)
package com.unmi;
import java.rmi.*;
/**
* 遠程接口必須擴展接口java.rmi.Remote
*/
public interface
HelloInterface extends Remote
{
/**
* 遠程接口方法必須拋出 java.rmi.RemoteException
*/
public String
say() throws RemoteException;
}
2. 實現遠程接口及遠程方法(繼承UnicastRemoteObject)(Hello.java)
package com.unmi;
import java.rmi.*;
import java.rmi.server.*;
/**
* 擴展了UnicastRemoteObject類,並實現遠程接口 HelloInterface
*/
public class
Hello extends UnicastRemoteObject implements HelloInterface
{
private String message;
/**
* 必須定義構造方法,即使是默認構造方法,也必須把它明確地寫出來,因爲它必須拋出出RemoteException異常
*/
public Hello(String msg) throws RemoteException
{
message = msg;
}
/**
* 遠程接口方法的實現
*/
public String
say() throws RemoteException
{
System.out.println("Called by HelloClient");
return message;
}
}
3. 啓動RMI註冊服務,並註冊遠程對象(HelloServer.java)
package com.unmi;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class
HelloServer
{
/**
* 啓動 RMI 註冊服務並進行對象註冊
*/
public static void main(String[] argv)
{
try
{
/*啓動RMI註冊服務,指定端口爲1099 (1099爲默認端口)
也可以通過命令 $java_home/bin/rmiregistry 1099啓動
這裏用這種方式避免了再打開一個DOS窗口
而且用命令rmiregistry啓動註冊服務還必須事先用RMIC生成一個stub類爲它所用*/
LocateRegistry.createRegistry(1099);
/*創建遠程對象的一個或多個實例,下面是hello對象
可以用不同名字註冊不同的實例*/
HelloInterface hello = new Hello("Hello, world!");
//把hello註冊到RMI註冊服務器上,命名爲Hello
Naming.rebind("Hello", hello);
/*如果要把hello實例註冊到另一臺啓動了RMI註冊服務的機器上*/
Naming.rebind("//192.168.1.105:1099/Hello",hello);
System.out.println("Hello Server is ready.");
}
catch (Exception e)
{
System.out.println("Hello Server failed: " + e);
}
}
}
4. 客戶端查找遠程對象,並調用遠程方法(HelloClient)
package com.unmi;
import java.rmi.Naming;
public class
HelloClient
{
/**
* 查找遠程對象並調用遠程方法
*/
public static void main(String[] argv)
{
try
{
HelloInterface hello = (HelloInterface) Naming.lookup("Hello");
/*如果要從另一臺啓動了RMI註冊服務的機器上查找hello實例
HelloInterface hello = (HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello");
調用遠程方法*/
System.out.println(hello.say());
}
catch (Exception e)
{
System.out.println("HelloClient exception: " + e);
}
}
}
5. 執行程序:啓動服務HelloServer;運行客戶端HelloClient進行調用