1. 程式人生 > >RMI 遠端方法呼叫

RMI 遠端方法呼叫

1、服務端定義服務介面,該介面必須繼承於Remote介面,然後定義介面方法,介面方法必須丟擲RemoteException異常:

public interface IntHelloRmi extends Remote {
	public String helloRmi() throws RemoteException;

	public String sayHello(String name) throws RemoteException;
}

 

2、服務端定義介面實現類,實現【1】已經定義好的服務介面,且必須繼承於UnicastRemoteObject類(客戶端呼叫時才可以進行例項拷貝):

public class ImpHelloRmi extends UnicastRemoteObject implements IntHelloRmi {

	private static final long serialVersionUID = 1L;

	protected ImpHelloRmi() throws RemoteException {
	}

	@Override
	public String helloRmi() throws RemoteException {
		System.out.println("helloRmi()方法被呼叫"); //將在服務端被執行
		return "Hello Rmi";
	}

	@Override
	public String sayHello(String name) throws RemoteException {
		System.out.println("sayHello()方法被呼叫"); //將在服務端被執行
		return "Hello " + name + "!";
	}

}

 

3、服務端定義服務類:此類持有一個服務介面實現類的例項物件,並將該物件繫結到一個網路地址名稱,客戶端將用此名稱獲取到該例項的一個拷貝:

public class RmiServer {
	IntHelloRmi helloRmi;

	public void server() throws RemoteException, MalformedURLException, AlreadyBoundException {
		helloRmi = new ImpHelloRmi();

		//遠端物件登錄檔例項
		LocateRegistry.createRegistry(9999);
		//把遠端物件註冊到RMI註冊伺服器上
		Naming.bind("rmi://localhost:9999/HelloRmi", helloRmi);
		System.out.println("server:物件繫結成功");
	}
}

 

4、服務端啟動此項服務,該服務將持續監聽對【3】已註冊網路地址名稱的呼叫:

public class RmiServerTest {
	public static void main(String[] args) {
		RmiServer rmiServer = new RmiServer();
		try {
			rmiServer.server();
		} catch (RemoteException | MalformedURLException | AlreadyBoundException e) {
			e.printStackTrace();
		}
	}
}

 

5、客戶端利用【3】定義好的網路地址名稱搜尋服務端介面實現類的例項物件,搜尋成功則將獲得一個該物件的拷貝

public class HelloRmiClient {
	IntHelloRmi helloRmi;

	public void client() throws MalformedURLException, RemoteException, NotBoundException {
		helloRmi = (IntHelloRmi) Naming.lookup("rmi://localhost:9999/HelloRmi");
		System.out.println("client:");
                //客戶端的呼叫將導致服務端對相應方法的實際執行,只將結果返回到此處
		System.out.println(helloRmi.helloRmi()); 
		System.out.println(helloRmi.sayHello("rmi"));
	}
}

 

6、客戶端呼叫【5】定義好的客戶端類例項的方法,客戶端對遠端例項的本地拷貝方法的呼叫實際將使得服務端執行相應的方法,並將結果返回到客戶端對該方法的呼叫處

public class RmiClientTest {
	public static void main(String[] args) {
		HelloRmiClient rmiClient = new HelloRmiClient();
		try {
			rmiClient.client();
		} catch (MalformedURLException | RemoteException | NotBoundException e) {
			e.printStackTrace();
		}
	}
}