日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Java 中 RMI 的使用

瀏覽:167日期:2022-08-13 08:46:24

詳解Java 中 RMI 的使用

RMI 介紹

RMI (Remote Method Invocation) 模型是一種分布式對象應用,使用 RMI 技術可以使一個 JVM 中的對象,調用另一個 JVM 中的對象方法并獲取調用結果。這里的另一個 JVM 可以在同一臺計算機也可以是遠程計算機。因此,RMI 意味著需要一個 Server 端和一個 Client 端。

Server 端通常會創建一個對象,并使之可以被遠程訪問。

這個對象被稱為遠程對象。Server 端需要注冊這個對象可以被 Client 遠程訪問。

Client 端調用可以被遠程訪問的對象上的方法,Client 端就可以和 Server 端進行通信并相互傳遞信息。

說到這里,是不是發現使用 RMI 在構建一個分布式應用時十分方便,它和 RPC 一樣可以實現分布式應用之間的互相通信,甚至和現在的微服務思想都十分類似。

RMI 工作原理

正所謂 “知其然知其所以然”,在開始編寫 RMI 代碼之前,有必要了解一下 RMI 的工作原理,RMI 中 Client 端是和 Server 端是如何通信的呢?

下圖的可以幫助我們理解RMI 的工作流程。

詳解Java 中 RMI 的使用

從圖中可以看到,Client 端有一個被稱 Stub 的東西,有時也會被成為存根,它是 RMI Client 的代理對象,Stub 的主要功能是請求遠程方法時構造一個信息塊,RMI 協議會把這個信息塊發送給 Server 端。

這個信息塊由幾個部分組成:

遠程對象標識符。 調用的方法描述。 編組后的參數值(RMI協議中使用的是對象序列化)。

既然 Client 端有一個 Stub 可以構造信息塊發送給 Server 端,那么 Server 端必定會有一個接收這個信息快的對象,稱為 Skeleton 。

它主要的工作是:

解析信息快中的調用對象標識符和方法描述,在 Server 端調用具體的對象方法。 取得調用的返回值或者異常值。 把返回值進行編組,返回給客戶端 Stub.

到這里,一次從 Client 端對 Server 端的調用結果就可以獲取到了。

RMI 開發

通過上面的介紹,知道了 RMI 的概念以及 RMI 的工作原理,下面介紹 RMI 的開發流程。

這里會通過一個場景進行演示,假設 Client 端需要查詢用戶信息,而用戶信息存在于 Server 端,所以在 Server 端開放了 RMI 協議接口供客戶端調用查詢。

RMI Server

Server 端主要是構建一個可以被傳輸的類 User,一個可以被遠程訪問的類 UserService,同時這個對象要注冊到 RMI 開放給客戶端使用。

1.定義服務器接口(需要繼承 Remote 類,方法需要拋出 RemoteException)。

package com.wdbyte.rmi.server;import java.rmi.Remote;import java.rmi.RemoteException;/** * RMI Server * * @author www.wdbyte.com * @date 2021/05/08 */public interface UserService extends Remote { /** * 查找用戶 * * @param userId * @return * @throws RemoteException */ User findUser(String userId) throws RemoteException;}

User 對象在步驟 3 中定義。

2.實現服務器接口(需要繼承 UnicastRemoteObject 類,實現定義的接口)。

package com.wdbyte.rmi.server;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;/** * @author www.wdbyte.com * @date 2021/05/08 */public class UserServiceImpl extends UnicastRemoteObject implements UserService { protected UserServiceImpl() throws RemoteException { } @Override public User findUser(String userId) throws RemoteException {// 加載在查詢 if ('00001'.equals(userId)) { User user = new User(); user.setName('金庸'); user.setAge(100); user.setSkill('寫作'); return user;}throw new RemoteException('查無此人'); }}

3.定義傳輸的對象,傳輸的對象需要實現序列化(Serializable)接口。

需要傳輸的類一定要實現序列化接口,不然傳輸時會報錯。IDEA 中如何生成 serialVersionUID,在文章末尾也附上了簡單教程。

package com.wdbyte.rmi.server;import java.io.Serializable;/** * * @author www.wdbyte.com * @date 2021/05/08 */public class User implements Serializable { private static final long serialVersionUID = 6490921832856589236L; private String name; private Integer age; private String skill; public String getName() {return name; } public void setName(String name) {this.name = name; } public Integer getAge() {return age; } public void setAge(Integer age) {this.age = age; } public String getSkill() {return skill; } public void setSkill(String skill) {this.skill = skill; }@Override public String toString() {return 'User{' + 'name=’' + name + ’’’ + ', age=' + age + ', skill=’' + skill + ’’’ + ’}’; }}

4.注冊( rmiregistry)遠程對象,并啟動服務端程序。

服務端綁定了 UserService 對象作為遠程訪問的對象,啟動時端口設置為 1900。

package com.wdbyte.rmi.server;import java.rmi.Naming;import java.rmi.registry.LocateRegistry;/** * RMI Server 端 * * @author https://www.wdbyte.com * @date 2021/05/08 */public class RmiServer { public static void main(String[] args) {try { UserService userService = new UserServiceImpl(); LocateRegistry.createRegistry(1900); Naming.rebind('rmi://localhost:1900/user', userService); System.out.println('start server,port is 1900');} catch (Exception e) { e.printStackTrace();} }}RMI Client

相比 Server 端,Client 端就簡單的多。直接引入可遠程訪問和需要傳輸的類,通過端口和 Server 端綁定的地址,就可以發起一次調用。

package com.wdbyte.rmi.client;import java.rmi.Naming;import com.wdbyte.rmi.server.User;import com.wdbyte.rmi.server.UserService;/** * @author https://www.wdbyte.com * @date 2021/05/08 */public class RmiClient { public static void main(String args[]) {User answer;String userId = '00001';try { // lookup method to find reference of remote object UserService access = (UserService)Naming.lookup('rmi://localhost:1900/user'); answer = access.findUser(userId); System.out.println('query:' + userId); System.out.println('result:' + answer);} catch (Exception ae) { System.out.println(ae);} }}RMI 測試

啟動 Server 端。

start server,port is 1900

啟動 Client 端。

query:00001result:User{name=’金庸’, age=100, skill=’寫作’}

如果 Client 端傳入不存在的 userId。

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.RemoteException: 查無此人serialVersionUID 的生成

IDEA 中生成 serialVersionUID,打開設置,如下圖所示勾選。

詳解Java 中 RMI 的使用

選中要生成 serialVersionUID 的類,按智能提示快捷鍵。

詳解Java 中 RMI 的使用

參考

[1] https://docs.oracle.com/javase/tutorial/rmi/overview.html

到此這篇關于詳解Java 中 RMI 的使用的文章就介紹到這了,更多相關java RMI使用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
玖玖精品视频| 国产精品主播在线观看| 亚洲精品乱码日韩| 国产一区二区三区国产精品| 日韩亚洲国产欧美| 久久一区视频| 日韩中文字幕麻豆| 激情视频网站在线播放色| 免费在线看一区| 久久精品免费看| 免费久久99精品国产| jizzjizz中国精品麻豆| 日本不卡视频在线观看| 欧美丝袜一区| 国产亚洲久久| 影院欧美亚洲| 国产一区二区三区不卡视频网站 | 欧美男人天堂| 欧美私人啪啪vps| 精品美女在线视频| 每日更新成人在线视频| 高清不卡亚洲| 国产乱码精品一区二区亚洲| 91久久久精品国产| 美国三级日本三级久久99| 婷婷色综合网| 91精品美女| 9999国产精品| 人人精品人人爱| 日韩精品免费视频人成| 国内自拍视频一区二区三区| 日韩一区精品| 在线午夜精品| 激情视频一区二区三区| 福利欧美精品在线| 国产精品三级| 日本亚州欧洲精品不卡| 黄色日韩在线| 久久九九精品| 亚洲啊v在线| 色婷婷色综合| 欧美激情日韩| 日本少妇精品亚洲第一区| 国产精品女主播一区二区三区| 久久九九电影| 日韩影院二区| 欧美一级鲁丝片| 日韩精品1区2区3区| 国精品产品一区| 国产精品毛片久久久| 日本欧美久久久久免费播放网| 蜜臀久久99精品久久久久宅男| 欧美日韩国产高清电影| 88xx成人免费观看视频库| 国产66精品| 国产a亚洲精品| 国产成人精品福利| 国产精品日韩精品中文字幕| 91亚洲无吗| 日韩久久一区| 日本精品另类| 欧美精品影院| 国产欧美一级| 久久av免费| 久久精品国产精品亚洲毛片| 麻豆成人91精品二区三区| 久久99蜜桃| 国产中文字幕一区二区三区| 国产一区二区三区免费在线| 国产精品成人a在线观看| 最新中文字幕在线播放| 日韩伦理一区| 99视频精品全国免费| 免费观看久久av| 国产精品腿扒开做爽爽爽挤奶网站| 午夜在线精品| 麻豆国产在线| 婷婷久久一区| 免费看日韩精品| 天堂俺去俺来也www久久婷婷| 日本精品在线播放| 国产欧美一区二区色老头| 国产精品白浆| 97国产精品| 亚洲精品网址| 水野朝阳av一区二区三区| 亚洲理论在线| 青青草91久久久久久久久| 久久av超碰| 精品三级久久| 视频一区中文字幕| 91精品国产一区二区在线观看| 麻豆中文一区二区| 在线看片福利| 99亚洲视频| 欧美午夜三级| 高潮一区二区| 视频在线观看国产精品| 久久国际精品| 日韩黄色大片网站| 夜夜嗨av一区二区三区网站四季av| 亚洲午夜国产成人| 国产麻豆一区二区三区精品视频| 麻豆一区二区99久久久久| 色婷婷精品视频| 亚洲永久字幕| 免费日韩成人| 国产综合色产| 日韩精品乱码av一区二区| 国产va免费精品观看精品视频| 欧美肉体xxxx裸体137大胆| 一区二区电影在线观看| 国产精品xxx| 久久中文字幕av| 亚洲日本久久| 鲁鲁在线中文| 亚洲乱码一区| 成人污污视频| 蜜乳av另类精品一区二区| 久久不见久久见中文字幕免费| 欧美一区三区| 久久国产人妖系列| 激情欧美一区二区三区| 国产乱人伦丫前精品视频| 欧美不卡在线| 久久激情av| 欧美日韩国产精品一区二区亚洲| 国产精品资源| 欧美日韩国产亚洲一区| 国产美女视频一区二区| 五月天久久久| 国产福利一区二区三区在线播放| 久久国产电影| 欧美日本不卡高清| 久久中文字幕av一区二区不卡| 欧美一级网址| 美女亚洲一区| 久久久免费人体| 久久国产精品亚洲77777| 成人精品动漫一区二区三区| 丝袜亚洲精品中文字幕一区| 国产精品99视频| 亚洲三级av| 亲子伦视频一区二区三区| 久久国产日韩欧美精品| 五月综合激情| 福利一区二区三区视频在线观看| 综合亚洲视频| 999国产精品永久免费视频app| 清纯唯美亚洲综合一区| 亚洲午夜精品久久久久久app| 国产伦精品一区二区三区千人斩 | 亚洲一区中文| 久久影院午夜精品| 欧美亚洲免费| 石原莉奈在线亚洲三区| 中国字幕a在线看韩国电影| 日本成人一区二区| 免费观看久久av| 黑人精品一区| 麻豆精品国产91久久久久久| 午夜亚洲福利| 亚洲制服少妇| 亚洲午夜在线| 91日韩在线| 麻豆极品一区二区三区| 四虎精品一区二区免费| 欧美日韩精品一本二本三本 | 欧美亚洲在线日韩| 国内自拍视频一区二区三区| 日韩av黄色在线| 蜜桃视频在线观看一区| 午夜国产一区二区| 电影亚洲精品噜噜在线观看 | 在线综合欧美| 91精品一区国产高清在线gif| 精品国产成人| 国产精品一国产精品k频道56| 亚洲午夜久久| 亚洲一区二区三区高清| 激情综合网五月| 亚洲www啪成人一区二区| 国产成人精品福利| 精品国产中文字幕第一页| 国产乱码精品一区二区三区四区| 蜜臀91精品一区二区三区| 最新国产拍偷乱拍精品| 99久久激情| 色吊丝一区二区| 日韩欧美1区| 亚洲国产欧美日本视频| 精品国产乱码| 麻豆中文一区二区| 国产精品www994| 国产探花在线精品| 日韩av成人高清| 日韩和欧美的一区| 日韩美女国产精品| 日韩精品第一| 欧美日韩一区二区三区不卡视频|