亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

java RMI詳細(xì)介紹及實例講解

瀏覽:2日期:2022-08-28 14:16:29

java本身提供了一種RPC框架——RMI(即RemoteMethodInvoke遠(yuǎn)程方法調(diào)用),在編寫一個接口需要作為遠(yuǎn)程調(diào)用時,都需要繼承了Remote,Remote接口用于標(biāo)識其方法可以從非本地虛擬機上調(diào)用的接口,只有在“遠(yuǎn)程接口”(擴展java.rmi.Remote的接口)中指定的這些方法才可遠(yuǎn)程使用,下面通過一個簡單的示例,來講解RMI原理以及開發(fā)流程:

為了真正實現(xiàn)遠(yuǎn)程調(diào)用,首先創(chuàng)建服務(wù)端工程rmi-server,結(jié)構(gòu)如下:

java RMI詳細(xì)介紹及實例講解 

代碼說明:

1.User.java:用于遠(yuǎn)程調(diào)用時pojo對象的傳輸,該對象必須實現(xiàn)Serializable接口,否則在調(diào)用過程中,會拋出NotSerializableException異常,代碼如下:

/** * 用戶信息,用于遠(yuǎn)程調(diào)用傳輸,必須實現(xiàn)Serializable接口 * * @author andy * */public class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return 'name : ' + this.name + ', age : ' + this.age; }}

2.Hello.java:遠(yuǎn)程接口,該接口需要繼承Remote接口,并且接口中的方法全都要拋出RemoteException異常,代碼如下:

import java.rmi.Remote;import java.rmi.RemoteException;import pers.andy.rmi.bean.User;/** * 定義一個遠(yuǎn)程接口,必須繼承Remote接口,其中需要遠(yuǎn)程調(diào)用的方法必須拋出RemoteException異常 * * @author andy * */public interface IHello extends Remote { /** * 更新user信息 * @param user * @return * @throws RemoteException */ public User updateUser(User user) throws RemoteException;}

3.HelloImpl:遠(yuǎn)程接口實現(xiàn)類,必須繼承UnicastRemoteObject(繼承RemoteServer->繼承RemoteObject->實現(xiàn)Remote,Serializable),只有繼承UnicastRemoteObject類,才表明其可以作為遠(yuǎn)程對象,被注冊到注冊表中供客戶端遠(yuǎn)程調(diào)用(補充:客戶端lookup找到的對象,只是該遠(yuǎn)程對象的Stub(存根對象),而服務(wù)端的對象有一個對應(yīng)的骨架Skeleton(用于接收客戶端stub的請求,以及調(diào)用真實的對象)對應(yīng),Stub是遠(yuǎn)程對象的客戶端代理,Skeleton是遠(yuǎn)程對象的服務(wù)端代理,他們之間協(xié)作完成客戶端與服務(wù)器之間的方法調(diào)用時的通信。),代碼如下:

/** * 遠(yuǎn)程的接口的實現(xiàn),繼承了UnicastRemoteObject,表明該類作為一個遠(yuǎn)程對象 * * @author andy * */public class HelloImpl extends UnicastRemoteObject implements IHello { /** * */ private static final long serialVersionUID = 1L; /** * 因為UnicastRemoteObject的構(gòu)造方法拋出了RemoteException異常,因此這里默認(rèn)的構(gòu)造方法必須寫,必須聲明拋出RemoteException異常 * * @throws RemoteException */ public HelloImpl() throws RemoteException { } public User updateUser(User user) throws RemoteException { System.out.println('-------------- 客戶端發(fā)送的user為' + user.toString()); user.setName('andy2'); user.setAge(30); return user; }}

4.HelloServer:服務(wù)端啟動類,用于創(chuàng)建遠(yuǎn)程對象注冊表以及注冊遠(yuǎn)程對象,代碼如下:

/** * 服務(wù)端啟動類 * * @author andy * */public class HelloServer { public static void main(String args[]) { try { // 本地主機上的遠(yuǎn)程對象注冊表Registry的實例,并指定端口為8888,這一步必不可少(Java默認(rèn)端口是1099) LocateRegistry.createRegistry(8888); // 把遠(yuǎn)程對象注冊到RMI注冊服務(wù)器上,并命名為RHello // 綁定的URL標(biāo)準(zhǔn)格式為:rmi://host:port/name(其中協(xié)議名可以省略,下面兩種寫法都是正確的) Naming.bind('rmi://localhost:8888/RHello', rhello); // Naming.bind('//localhost:8888/RHello',rhello); System.out.println('------------遠(yuǎn)程對象IHello注冊成功,等待客戶端調(diào)用...'); } catch (RemoteException e) { System.out.println('創(chuàng)建遠(yuǎn)程對象發(fā)生異常!'); e.printStackTrace(); } catch (AlreadyBoundException e) { System.out.println('發(fā)生重復(fù)綁定對象異常!'); e.printStackTrace(); } catch (MalformedURLException e) { System.out.println('發(fā)生URL畸形異常!'); e.printStackTrace(); } }}

補充說明:為何HelloImpl繼承了UnicastRemoteObject就可以被作為遠(yuǎn)程對象發(fā)布,查閱UnicastRemoteObject的源碼可以發(fā)現(xiàn):

protected UnicastRemoteObject() throws RemoteException { this(0); } protected UnicastRemoteObject(int port) throws RemoteException { this.port = port; exportObject((Remote) this, port); }

其實在啟動server端的時候,new了HelloImpl對象,因為繼承了UnicastRemoteObject,會先調(diào)用父類的構(gòu)造方法,這時候,就會將this(當(dāng)前對象)通過exportObject方法注冊。

所以,如果在被導(dǎo)出的對象需要繼承其它的類,那么就可以不采用集成UnicastRemoteObject的方式,而是通過exportObject方法將其導(dǎo)出為遠(yuǎn)程對象:

...// 創(chuàng)建一個遠(yuǎn)程對象IHello rhello = new HelloImpl();//HelloImpl不需要繼承UnicastRemoteObject類,通過exportObject將其顯示導(dǎo)出UnicastRemoteObject.exportObject(rhello,0);...

以上即是服務(wù)端所有代碼,接下來是創(chuàng)建客戶端工程,結(jié)構(gòu)如下:

java RMI詳細(xì)介紹及實例講解

實際應(yīng)用開發(fā)中,客戶端的User.java和IHello.java應(yīng)該是從服務(wù)端導(dǎo)出jar包的形式添加到依賴庫里,因此這邊只介紹HelloClient.java,該類為客戶端啟動類,用于在注冊表中查找遠(yuǎn)程對象實現(xiàn)遠(yuǎn)程方法調(diào)用,代碼如下:

/** * 客戶端啟動類 * * @author andy * */public class HelloClient { public static void main(String args[]) { try { // 在RMI服務(wù)注冊表中查找名稱為RHello的對象,并調(diào)用其上的方法 IHello rhello = (IHello) Naming.lookup('rmi://localhost:8888/RHello'); // 構(gòu)造user對象,測試遠(yuǎn)程對象傳輸 User user = new User(); user.setAge(20); user.setName('andy'); System.out.println('-------------- 服務(wù)端返回的的user為' + rhello.updateUser(user).toString()); } catch (NotBoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } }}

到此為止,客戶端和服務(wù)端的工程都搭建完畢,現(xiàn)在可以進行測試,執(zhí)行次序和測試結(jié)果如下所示:

1.首先運行服務(wù)端啟動類HelloServer,結(jié)果如下:

服務(wù)端:------------遠(yuǎn)程對象IHello注冊成功,等待客戶端調(diào)用...

2.運行客戶端啟動類,結(jié)果如下:

服務(wù)端:-------------- 客戶端發(fā)送的user為name : andy, age : 20 客戶端:-------------- 服務(wù)端返回的的user為name : andy2, age : 30

 到此這篇關(guān)于java RMI詳細(xì)介紹及實例講解的文章就介紹到這了,更多相關(guān)java RMI 內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)! 

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 欧美一区二区在线视频 | 中文字幕片 | 欧美黄色免费看 | 国产h视频在线观看高清 | 精品国产综合区久久久久99 | 成人精品视频 | 在线免费观看视频黄 | 亚洲乱码国产一区网址 | 欧美一级黄色片 | 骚骚精品免费看 | 亚洲 午夜在线一区 | 久热精品视频 | 小明看看永久视频 | 国产日韩欧美在线播放 | 国产精品公开免费视频 | 特级毛片a级毛免费播放 | 免费观看黄色毛片 | 国产娱乐凹凸视觉盛宴在线视频 | 伊在人香蕉99久久 | 国产成人一区二区三区在线播放 | 国产国语一级毛片全部 | 天天影视综合网色综合国产 | 欧美黄色成人 | 久久中文字幕不卡一二区 | 精品一区二区久久 | 闲人综合网| 国产合集福利视频在线视频 | 欧美线在线精品观看视频 | 这里只有精品99re在线 | 亚洲一区不卡视频 | 一级毛片日本特黄97人人 | 国产免费又色又爽又黄在线观看 | 国产精品自拍一区 | 国产在线乱码在线视频 | 天堂激情 | 亚洲国产aaa毛片无费看 | 女人与zzzxxxx0oo0 | 成人深夜福利在线播放不卡 | 九九热精品在线观看 | a级国产乱理片在线观看 | 亚洲精品网站在线观看不卡无广告 |