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