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

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

詳解Java 中 RMI 的使用

瀏覽:164日期: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久久,三上悠亚国产精品一区二区三区
精品国产黄a∨片高清在线| 老牛影视精品| 国产精品porn| 国产不卡精品在线| 久久国产欧美日韩精品| 精品视频一区二区三区四区五区 | 久久香蕉网站| 久久免费国产| 色在线视频观看| 日韩国产91| 神马午夜在线视频| 一区二区三区网站| 国产韩日影视精品| 美女精品视频在线| 亚洲综合精品| 亚洲欧美日韩视频二区| 国产精品99一区二区| 国产精品传媒麻豆hd| 蜜臀av性久久久久蜜臀aⅴ四虎| 日韩精品视频在线看| 99久久精品国产亚洲精品| 欧美日韩91| 日韩高清二区| 国产精品美女久久久| 色综合www| 国产999精品在线观看 | 黑丝美女一区二区| 婷婷成人综合| 久久美女性网| 国产成人免费av一区二区午夜| 一区二区亚洲视频| 国产另类在线| 久久av电影| 美女尤物国产一区| 中文字幕亚洲精品乱码| 日本亚洲欧美天堂免费| 日本v片在线高清不卡在线观看| 91精品国产自产在线观看永久∴| 久久久久久久久久久妇女| 日韩欧美三级| 91中文字幕精品永久在线| av资源中文在线| 97精品国产福利一区二区三区| 国产欧美一区二区三区精品酒店 | 国产传媒av在线| 在线亚洲人成| 美女毛片一区二区三区四区| 国产精品麻豆成人av电影艾秋 | 亚洲午夜黄色| 亚洲成人精品| 日本在线不卡视频| 久久亚洲人体| 97精品国产一区二区三区| 亚洲精品免费观看| 国产精品毛片aⅴ一区二区三区| 国产视频欧美| 欧美一级网站| 激情综合自拍| 国产精品99久久精品| 欧美日韩一区二区三区不卡视频 | 日韩av在线中文字幕| 日韩高清在线不卡| 日本大胆欧美人术艺术动态| 欧美福利一区| 亚洲一级特黄| 久久精品亚洲人成影院 | 中文亚洲欧美| 99久久九九| 日韩久久视频| 国产女人18毛片水真多18精品| 91欧美极品| 亚州av乱码久久精品蜜桃| 国产日韩亚洲| 国产亚洲精品精品国产亚洲综合| 日韩免费av| 日本不卡高清| 99国产精品久久久久久久| 日韩精品一区二区三区av| 日韩大片在线播放| 国产精品久久久久av蜜臀| 免费看欧美美女黄的网站| 久久一区二区三区喷水| 91欧美国产| 日韩在线高清| 国产美女精品| 久久91导航| 国产探花一区二区| 免费精品国产| 国产精品玖玖玖在线资源| 亚洲深夜av| 午夜免费一区| 视频在线在亚洲| 久久国产精品久久久久久电车| 久久精品国产68国产精品亚洲| 精品在线99| 国产一卡不卡| 亚洲免费精品| 欧美理论视频| 亚洲午夜精品久久久久久app| 国产一区二区三区精品在线观看| 欧美精品国产一区| 日韩中文字幕一区二区高清99| 97久久亚洲| 精品一区二区三区亚洲| 伊人久久亚洲美女图片| 青青草精品视频| 日本欧美不卡| 国产精品3区| 激情欧美亚洲| 日韩二区三区在线观看| 欧美激情综合| 精品欧美视频| av亚洲免费| 日本v片在线高清不卡在线观看| 日韩手机在线| 日韩久久视频| japanese国产精品| 亚洲精品成人一区| 91欧美国产| 三级一区在线视频先锋| 蜜桃久久久久久| 日本午夜精品久久久| 成人精品国产亚洲| 午夜在线观看免费一区| 麻豆久久久久久| 亚洲综合二区| 99香蕉国产精品偷在线观看 | 综合欧美精品| 国产精品sm| aa亚洲婷婷| 亚洲www啪成人一区二区| 欧美黄页在线免费观看 | 国产图片一区| 人人精品人人爱| 国产在线观看91一区二区三区| 日韩综合精品| 夜久久久久久| 91嫩草亚洲精品| 国产欧美日韩在线观看视频 | 米奇777超碰欧美日韩亚洲| 国产精品国产三级国产在线观看| 美女精品一区二区| 国产美女久久| 在线综合视频| 亚洲永久av| 7777精品| 久久久久久久久丰满| 欧美激情日韩| 国产午夜一区| 欧美亚洲二区| 国产毛片精品| 国产精品专区免费| 欧美综合国产| 国产精品亚洲产品| 午夜在线视频一区二区区别 | 久久国产精品色av免费看| 玖玖精品视频| 日韩一区免费| 免费在线亚洲| 精品美女视频| 日韩精品欧美精品| 欧美精品激情| 日韩欧美国产精品综合嫩v| 麻豆精品视频在线观看| 亚洲精品系列| 国产福利亚洲| 亚洲精品一二三**| 亚洲欧美日韩国产一区| 国产午夜久久| 青草综合视频| 午夜天堂精品久久久久| 日韩精品视频网站| 国精品一区二区| 日韩在线第七页| 亚洲va中文在线播放免费| 蜜芽一区二区三区| 午夜在线一区| 国产亚洲一级| 日本电影久久久| 国产精品99在线观看| 久久激情五月婷婷| 久久这里只有| 久久国产电影| re久久精品视频| 亚洲婷婷丁香| 国产精品2区| 激情欧美丁香| 精品国产不卡一区二区| 性色一区二区| 久久精品99久久无色码中文字幕| 樱桃成人精品视频在线播放| 免费在线播放第一区高清av| 国产精品蜜芽在线观看| 久久久久一区| 国产欧美综合一区二区三区| 中文字幕在线看片| 99久久99久久精品国产片果冰| 日韩va亚洲va欧美va久久| 亚洲欧美日韩国产| 欧美久久精品|