日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java RMI 入门

發布時間:2024/4/13 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java RMI 入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java RMI 入門

  • 如何通信
  • 實戰
  • 完整代碼

??Java RMI 指 JDK 內置的關于實現遠程方法調用(Remote Method Invocation)的 API。這些 API 位于包 java.rmi 中。通過 Java RMI,可以直接在客戶端調用服務端的方法,并獲得其返回值。Java RMI 是 RPC(Remote procedure call) 技術的 Java 實現,它提供了一種非常便捷的方式在 Java 中實現 RPC。

??使用 RMI 之前,需要知道以下概念:

  • 服務端

  • 服務端的暴露方法

  • 客戶端

??RMI 可以讓客戶端調用位于服務端的暴露方法(暴露方法的具體代碼位于服務端),就像是這個暴露方法本來就位于客戶端一樣。不過要注意的是,雖然位于服務端的暴露方法是由客戶端觸發調用的,但暴露方法是在服務端運行的,客戶端只能為其提供實參,并獲得其返回值。

如何通信

??對于服務端,它需要為自己設置一個端口號,接著設置哪個對象對外暴露,并為每個暴露對象設置一個名稱。暴露了這個對象,就相當于暴露了這個對象的 public 方法。然后,RMI 會自動為每個暴露對象生成一個唯一的 URL,URL 將根據服務端 IP、端口號、暴露對象名來生成。

??對于客戶端,只需要根據這個暴露對象的 URL 就可以直接獲得這個對象,然后就可以調用這個對象的 public 方法了。

實戰

  • 編寫一個暴露對象接口,這個接口必須繼承接口 Remote,而后者是 RMI 提供的接口。因為雖然客戶端只需要根據 URL 就可以獲得暴露對象,但 Java 的語法要求至少要有一個類型才能接收這個對象。也就是說,所有的暴露對象都必須是一個暴露對象接口的子類,且這個暴露對象接口必須對服務端、客戶端都可見。

    因此這個暴露對象接口將提供一系列供客戶端遠程調用的暴露方法。

    package org.wangpai.demo.rmi.common;import java.rmi.Remote; import java.rmi.RemoteException;public interface Expose extends Remote {Response call(Request request) throws RemoteException; }
  • 編寫提供給這個暴露方法的實參、返回值。注意:它們必須實現接口 Serializable,因為通信時,RMI 底層借助了對象的序列化、反序列化。

    package org.wangpai.demo.rmi.common;import java.io.Serializable;public interface Request extends Serializable {Object getData(); } package org.wangpai.demo.rmi.common;import java.io.Serializable;public interface Response extends Serializable {Object getData(); }
  • 對于服務端的具體暴露對象所屬的類,它必須還要將類 UnicastRemoteObject 繼承,同時實現上面的暴露對象接口。對于服務端的這個具體暴露類,不必對客戶端可見,因此服務端可以對其自由拓展。

    package org.wangpai.demo.rmi.server;import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import org.wangpai.demo.rmi.common.Expose; import org.wangpai.demo.rmi.common.Request; import org.wangpai.demo.rmi.common.Response;public class Service extends UnicastRemoteObject implements Expose {protected Service() throws RemoteException {super();}@Overridepublic Response call(Request request) throws RemoteException {System.out.println("------ 接收到客戶端的數據 -------");System.out.println(request.getData());System.out.println("---------------------------");return () -> "Hello, Client.";} }
  • 在服務端創建這個暴露類的對象,并注冊在 RMI 中。

    package org.wangpai.demo.rmi.server;import java.rmi.AlreadyBoundException; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import org.wangpai.demo.rmi.common.Protocol;public class Server {public static void start() throws RemoteException, AlreadyBoundException {var registry = LocateRegistry.createRegistry(Protocol.SERVER_PORT);var service = new Service();registry.bind(Protocol.SERVICE_URL, service);}public static void main(String[] args) throws RemoteException, AlreadyBoundException {start();} }

    這里,服務端需要與客戶端進行一些約定,如服務端端口號、暴露對象的 URL 等。

    package org.wangpai.demo.rmi.common;public class Protocol {public final static int SERVER_PORT = 7777;public final static String SERVER_BASE_URL = "rmi://127.0.0.1:" + SERVER_PORT + "/";public final static String SERVICE_URL = "service"; }
  • 現在可以嘗試在客戶端進行遠程調用了。

    package org.wangpai.demo.rmi.client;import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; import org.wangpai.demo.rmi.common.Expose; import org.wangpai.demo.rmi.common.Protocol; import org.wangpai.demo.rmi.common.Request;public class Client {public static void remoteCall() throws MalformedURLException, NotBoundException, RemoteException {System.out.println("************ 連接遠程服務端 ***********");// 此處強制轉換時,不能轉換成類 Servicevar service = (Expose) Naming.lookup(Protocol.SERVER_BASE_URL + Protocol.SERVICE_URL);System.out.println("************ 遠程服務端連接成功 ***********");System.out.println("************ 開始遠程調用 ***********");var response = service.call((Request) () -> "Hello, I'm a client.");System.out.println("************** 遠程調用結束 ********************");System.out.println("------ 接收到服務端的數據 -------");System.out.println(response.getData());System.out.println("---------------------------");}public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {remoteCall();} }
  • 注意:項目運行的時候肯定是服務端先啟動,然后客戶端才能運行。

  • 客戶端運行效果圖:

  • 服務端運行效果圖:

  • 完整代碼

    ??已上傳至 GitCode 中,可免費下載:https://gitcode.net/wangpaiblog/20220202-java_rmi

    總結

    以上是生活随笔為你收集整理的Java RMI 入门的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩美女在线视频 | 午夜激情在线播放 | 欧美精品福利视频 | 日韩经典一区二区三区 | 国产视频xxxx | 芒果视频污污 | 中文天堂在线视频 | 丁香婷婷综合网 | 制服 丝袜 激情 欧洲 亚洲 | 国语对白做受按摩的注意事项 | 四虎黄色影视 | 人人澡超碰碰 | 午夜性视频 | 日本欧美一区二区三区不卡视频 | 中文字幕第一页在线 | 中文字幕av一区二区三区谷原希美 | 亚洲成人精品在线播放 | 中国老头性行为xxxx | 污污内射在线观看一区二区少妇 | 国产怡红院 | 国产精品自拍视频 | 欧美一区二区三区四区五区六区 | 欧美成人激情视频 | 91精品国产综合久久久蜜臀图片 | 打屁股外国网站 | 国产白嫩美女无套久久 | 亚洲少妇一区二区 | 91官网视频| 天天干夜夜艹 | 久久夜色网 | 四虎com | 亚洲天堂区 | 你懂的成人 | 色玖玖| 韩国激情呻吟揉捏胸视频 | 国产毛片不卡 | jizz国产在线 | 一区二区在线视频观看 | 国 产 黄 色 大 片 | 亚洲不卡电影 | 日本一品道 | 爆乳2把你榨干哦ova在线观看 | 成人靠逼视频 | 久久蜜桃精品 | 亚洲欧美另类一区 | 亚洲欧美另类一区 | 成人毛片在线精品国产 | 欧美人体一区二区 | 国产欧美一区二区精品性色 | 国产人妻一区二区三区四区五区六 | 沈樵精品国产成av片 | 日本打屁股网站 | 香蕉av777xxx色综合一区 | 国产精品色网 | 亚洲 欧美 变态 另类 综合 | 涩涩成人 | 伊人中文网 | 91精品色| 黄色免费视屏 | 欧美中文字幕在线观看 | 国产精品一线二线三线 | aa在线| 不卡视频一区二区 | 亚洲国产网站 | 国产99久久久欧美黑人 | 精品久久久久久久久久久国产字幕 | 五月婷婷六月丁香综合 | 亲子乱aⅴ一区二区三区 | 国产深夜福利在线 | 91在线网址 | 99久久久无码国产精品不卡 | 在线免费黄色网址 | 超碰在线网站 | 天天草天天操 | 日韩综合一区二区三区 | 亚洲精品在线一区二区 | 97色伦97色伦国产欧美空 | 中文字幕人乱码中文字 | 丁香婷婷深情五月亚洲 | 99自拍偷拍视频 | 亚洲福利一区二区三区 | 国产精品99久久免费黑人人妻 | 69久久夜色精品国产69 | 成人黄色在线观看 | 日韩一二三级 | 欧美色噜噜 | k8yy毛片 | 污视频大全 | 日本不卡视频在线播放 | 欧美xxxx视频 | 理论片91| 久久911| 久av在线| 羞羞漫画在线 | 人人爱人人澡 | 国产成人精品无码免费看81 | 日韩欧美中文字幕一区二区 | 欧美激情一二三 | cao我|