5.對於RMI的理解
阿新 • • 發佈:2019-02-19
下面我將介紹一個完整的例項,讓初學者能快速體驗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進行呼叫