如何用java編寫(xiě)一個(gè)rmi
RMI 指的是遠(yuǎn)程方法調(diào)用 (Remote Method Invocation)。它是一種機(jī)制,能夠讓在某個(gè) Java虛擬機(jī)上的對(duì)象調(diào)用另一個(gè) Java 虛擬機(jī)中的對(duì)象上的方法??梢杂么朔椒ㄕ{(diào)用的任何對(duì)象必須實(shí)現(xiàn)該遠(yuǎn)程接口。
調(diào)用這樣一個(gè)對(duì)象時(shí),其參數(shù)為 "marshalled" 并將其從本地虛擬機(jī)發(fā)送到遠(yuǎn)程虛擬機(jī)(該遠(yuǎn)程虛擬機(jī)的參數(shù)為 "unmarshalled")上。該方法終止時(shí),將編組來(lái)自遠(yuǎn)程機(jī)的結(jié)果并將結(jié)果發(fā)送到調(diào)用方的虛擬機(jī)。如果方法調(diào)用導(dǎo)致拋出異常,則該異常將指示給調(diào)用方。
提供遠(yuǎn)端訪(fǎng)問(wèn)的時(shí)候,我們首先需要定義遠(yuǎn)端能夠訪(fǎng)問(wèn)哪些東西,在Java中,定義這類(lèi)接口需要實(shí)現(xiàn)Remote接口
public interface Business extends Remote{ public String echo(String msg) throws RemoteException; }
定義完接口之后,這些功能是需要我們自己在Server端實(shí)現(xiàn)的,因此,聲明一個(gè)類(lèi)實(shí)現(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; } }
實(shí)現(xiàn)完這個(gè)方法之后,有一個(gè)問(wèn)題是,怎么運(yùn)行,既然是遠(yuǎn)端訪(fǎng)問(wèn),肯定得有端口號(hào),肯定得有實(shí)例,所以我們還需要注冊(cè)我們的代碼
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); } }
這里有兩個(gè)Java的類(lèi):UnicastRemoteObject和LocateRegistry
一個(gè)接口:Registry
Registry接口:對(duì)簡(jiǎn)單的遠(yuǎn)端對(duì)象提供一個(gè)遠(yuǎn)端接口用于提供存儲(chǔ)和獲取遠(yuǎn)端對(duì)象的引用,而這些是通過(guò)任意的String類(lèi)型的變量名稱(chēng)獲取,bind,unbind,rebind方法是用于更改注冊(cè)的這些名稱(chēng),lookup和list方法是用于查詢(xún)當(dāng)前當(dāng)前已經(jīng)綁定的對(duì)象。
UnicastRemoteObject類(lèi):用于導(dǎo)出一個(gè)遠(yuǎn)端對(duì)象
LocateRegistry類(lèi):是一個(gè)用來(lái)獲得遠(yuǎn)端調(diào)用對(duì)象引用的輔助類(lèi)程序,主要是在一個(gè)特定的IP上構(gòu)建一個(gè)遠(yuǎn)端對(duì)象來(lái)接受來(lái)自特定端口的回調(diào)。
簡(jiǎn)單的服務(wù)端完成了,現(xiàn)在來(lái)看客戶(hù)端:
客戶(hù)端代碼就更加簡(jiǎn)單,前面我們提到我們可以通過(guò)Registry的lookup方法來(lái)獲取當(dāng)前已經(jīng)綁定的服務(wù),所以很自然,我們首先要獲得這個(gè)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")); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis-Plus實(shí)現(xiàn)多數(shù)據(jù)源的示例代碼
這篇文章主要介紹了MyBatis-Plus實(shí)現(xiàn)多數(shù)據(jù)源的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):棧
這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助2021-07-07詳解OAuth2 Token 一定要放在請(qǐng)求頭中嗎
這篇文章主要介紹了詳解OAuth2 Token 一定要放在請(qǐng)求頭中嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07子類(lèi)繼承父類(lèi)時(shí)構(gòu)造函數(shù)相關(guān)問(wèn)題解析
這篇文章主要介紹了子類(lèi)繼承父類(lèi)時(shí)構(gòu)造函數(shù)相關(guān)問(wèn)題解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11SpringBoot自定義對(duì)象參數(shù)超詳細(xì)介紹作用
SpringBoot通過(guò)自定義對(duì)象參數(shù),可以實(shí)現(xiàn)自動(dòng)類(lèi)型轉(zhuǎn)換與格式化,并可以級(jí)聯(lián)封裝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09Java利用ffmpeg實(shí)現(xiàn)視頻MP4轉(zhuǎn)m3u8
本文綜合了下網(wǎng)上教程,從ffmpeg工具轉(zhuǎn)碼,ffmpeg視頻播放,java語(yǔ)言操控ffmpeg轉(zhuǎn)碼,轉(zhuǎn)碼后視頻上傳阿里云oss,四個(gè)方面完整記錄下這個(gè)流程,需要的朋友可以參考下2024-02-02java 多線(xiàn)程Thread與runnable的區(qū)別
這篇文章主要介紹了java 多線(xiàn)程Thread與runnable的區(qū)別的相關(guān)資料,java線(xiàn)程有兩種方法繼承thread類(lèi)與實(shí)現(xiàn)runnable接口,下面就提供實(shí)例幫助大家理解,需要的朋友可以參考下2017-08-08