如何用java編寫一個rmi
RMI 指的是遠程方法調(diào)用 (Remote Method Invocation)。它是一種機制,能夠讓在某個 Java虛擬機上的對象調(diào)用另一個 Java 虛擬機中的對象上的方法??梢杂么朔椒ㄕ{(diào)用的任何對象必須實現(xiàn)該遠程接口。
調(diào)用這樣一個對象時,其參數(shù)為 "marshalled" 并將其從本地虛擬機發(fā)送到遠程虛擬機(該遠程虛擬機的參數(shù)為 "unmarshalled")上。該方法終止時,將編組來自遠程機的結(jié)果并將結(jié)果發(fā)送到調(diào)用方的虛擬機。如果方法調(diào)用導致拋出異常,則該異常將指示給調(diào)用方。
提供遠端訪問的時候,我們首先需要定義遠端能夠訪問哪些東西,在Java中,定義這類接口需要實現(xiàn)Remote接口
public interface Business extends Remote{
public String echo(String msg) throws RemoteException;
}
定義完接口之后,這些功能是需要我們自己在Server端實現(xiàn)的,因此,聲明一個類實現(xiàn)我們提供接口。
public class BusinessImpl implements Business{
@Override
public String echo(String msg) throws RemoteException {
if("quit".equalsIgnoreCase(msg)) {
System.out.println("Server will be shutdown");
System.exit(0);
}
System.out.println("Message from client:"+msg);
return "Server response:"+msg;
}
}
實現(xiàn)完這個方法之后,有一個問題是,怎么運行,既然是遠端訪問,肯定得有端口號,肯定得有實例,所以我們還需要注冊我們的代碼
public class Server {
public static final String SERVER_REGISTER_NAME = "BusineeDemo";
public static void main(String[] args) throws RemoteException {
int port = 2016;
Business business = new BusinessImpl();
UnicastRemoteObject.exportObject(business,port);
Registry registry = LocateRegistry.createRegistry(1099);
registry.rebind(SERVER_REGISTER_NAME, business);
}
}
這里有兩個Java的類:UnicastRemoteObject和LocateRegistry
一個接口:Registry
Registry接口:對簡單的遠端對象提供一個遠端接口用于提供存儲和獲取遠端對象的引用,而這些是通過任意的String類型的變量名稱獲取,bind,unbind,rebind方法是用于更改注冊的這些名稱,lookup和list方法是用于查詢當前當前已經(jīng)綁定的對象。
UnicastRemoteObject類:用于導出一個遠端對象
LocateRegistry類:是一個用來獲得遠端調(diào)用對象引用的輔助類程序,主要是在一個特定的IP上構(gòu)建一個遠端對象來接受來自特定端口的回調(diào)。
簡單的服務端完成了,現(xiàn)在來看客戶端:
客戶端代碼就更加簡單,前面我們提到我們可以通過Registry的lookup方法來獲取當前已經(jīng)綁定的服務,所以很自然,我們首先要獲得這個Registry
public class Client {
public static void main(String[] args) throws RemoteException, NotBoundException {
// Registry registry = LocateRegistry.getRegistry("localhost");
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
Business business = (Business) registry.lookup(Server.SERVER_REGISTER_NAME);
System.out.println(business.echo("Hello Server"));
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
kafka 重新分配partition和調(diào)整replica的數(shù)量實現(xiàn)
當需要提升Kafka集群的性能和負載均衡時,可通過kafka-reassign-partitions.sh命令手動重新分配Partition,增加節(jié)點后,可以將Topic的Partition的Leader節(jié)點均勻分布,以提高寫入和消費速度,感興趣的可以了解一下2022-03-03
Springboot整合多數(shù)據(jù)源配置流程詳細講解
這篇文章主要介紹了Springboot整合多數(shù)據(jù)源配置流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-03-03
SpringCloud使用Feign實現(xiàn)遠程調(diào)用的使用示例
Feign是一個基于注解的HTTP客戶端庫,它允許您將HTTP請求轉(zhuǎn)換為聲明式的Java接口,本文主要介紹了SpringCloud使用Feign實現(xiàn)遠程調(diào)用的使用示例,感興趣的可以了解一下2023-09-09

