<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      用遠程代理模式輕松實現遠程服務調用,打開編程新大門

      通過遠程代理來實現一個簡易的遠程過程調用實例。帶你打開新的大門。

      Socket 遠程代理服務案例

      基于 Socket 的遠程服務,我們需要完成以下步驟:

      1. 服務端實現:創建一個遠程服務,通過 Socket 接受客戶端請求并提供計算服務。
      2. 客戶端實現:客戶端通過代理類訪問遠程計算服務,代理通過網絡與服務器交互。
      3. 代理類:代理類會通過網絡與服務器建立連接,轉發請求并返回響應。

      看下案例類圖應該就明白了

      案例類圖

      image

      客戶端和服務端都共有服務接口RemoteCalculationService,服務端實現了該接口的具體處理邏輯,客戶端通過socket來完成具體服務的調用。

      在這里必須明確理解的一個點就是,客戶端的遠程代理類。這個遠程代理類是一個實現了共有服務接口RemoteCalculationService的實現類,但是在真實的場景中,這個代理類不需要我們手工動去實現,一般由所依賴的底層去實現(比如Apache CXF),我們要做的事情是配置IP和端口等操作,然后調用接口內的方法即可。

      客戶端在這個過程中只需要關注這個服務接口RemoteCalculationService有什么方法可以使用、具體傳什么參數和返回值是什么即可,給開發者的感覺就像是調用本地方法一樣

      具體代碼實現如下:

      遠程服務接口

      我們首先定義一個遠程計算服務接口,它提供加法和減法功能:

      // 遠程接口
      public interface RemoteCalculationService {
          int add(int a, int b);
          int subtract(int a, int b);
      }
      

      遠程服務實現

      然后實現該接口,模擬一個遠程計算服務。此服務將被遠程調用:

      public class RemoteCalculationServiceImpl implements RemoteCalculationService {
      
          @Override
          public int add(int a, int b) {
              return a + b;
          }
      
          @Override
          public int subtract(int a, int b) {
              return a - b;
          }
      
      }
      

      遠程服務處理器

      該類負責處理來自客戶端的請求,它從網絡中讀取數據并返回計算結果:

      import java.io.*;
      import java.net.*;
      
      public class RemoteCalculationServiceHandler implements Runnable {
          private Socket socket;
      
          public RemoteCalculationServiceHandler(Socket socket) {
              this.socket = socket;
          }
      
          @Override
          public void run() {
              try (
                      ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
                      ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream())
              ) {
                  // 讀取請求的操作
                  String operation = (String) inputStream.readObject();
                  int a = inputStream.readInt();
                  int b = inputStream.readInt();
      
                  RemoteCalculationServiceImpl service = new RemoteCalculationServiceImpl();
                  int result = 0;
                  System.out.println("執行的操作:"+operation);
                  // 根據操作執行相應的計算
                  if ("add".equals(operation)) {
                      result = service.add(a, b);
                  } else if ("subtract".equals(operation)) {
                      result = service.subtract(a, b);
                  }
                  System.out.println("執行結果:"+result);
                  // 發送結果回客戶端
                  outputStream.writeInt(result);
                  outputStream.flush();
              } catch (IOException | ClassNotFoundException e) {
                  e.printStackTrace();
              } finally {
                  try {
                      socket.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
      }
      

      遠程Socket服務

      public class RemoteServer {
      
          // 服務器端啟動
          public static void main(String[] args) {
              try (ServerSocket serverSocket = new ServerSocket(8080)) {
                  System.out.println("Server is running...");
                  while (true) {
                      Socket socket = serverSocket.accept();
                      new Thread(new RemoteCalculationServiceHandler(socket)).start();
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
      

      遠程服務代理類

      代理類負責與遠程服務通信。客戶端調用代理的方法時,代理會通過 Socket 連接到遠程服務器,將請求發送給遠程服務,然后返回結果。

      import java.io.*;
      import java.net.*;
      
      public class RemoteCalculationServiceProxy implements RemoteCalculationService {
          private String serverAddress;
          private int serverPort;
      
          public RemoteCalculationServiceProxy(String serverAddress, int serverPort) {
              this.serverAddress = serverAddress;
              this.serverPort = serverPort;
          }
      
          @Override
          public int add(int a, int b) {
              return sendRequest("add", a, b);
          }
      
          @Override
          public int subtract(int a, int b) {
              return sendRequest("subtract", a, b);
          }
      
          private int sendRequest(String operation, int a, int b) {
              try (
                  Socket socket = new Socket(serverAddress, serverPort);
                  ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
                  ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream())
              ) {
                  // 發送操作請求
                  outputStream.writeObject(operation);
                  outputStream.writeInt(a);
                  outputStream.writeInt(b);
                  outputStream.flush();
      
                  // 讀取結果
                  return inputStream.readInt();
              } catch (IOException e) {
                  e.printStackTrace();
              }
              return 0;
          }
      }
      

      客戶端

      客戶端通過 RemoteCalculationServiceProxy 訪問遠程計算服務。代理會將請求發送到服務器并接收響應。

      public class Client {
          public static void main(String[] args) {
              RemoteCalculationService service = new RemoteCalculationServiceProxy("localhost", 8080);
      
              // 通過代理調用遠程服務
              System.out.println("add 執行結果: " + service.add(10, 5));
              System.out.println("subtract 執行結果: " + service.subtract(10, 5));
          }
      }
      

      運行步驟

      1.運行服務器端

      首先運行服務器端RemoteServer,這會啟動一個 ServerSocket 來監聽客戶端的請求。每當接收到客戶端請求時,服務器會在一個新線程中處理。

      2.運行客戶端

      然后啟動客戶端Client,它通過代理類與服務器端進行交互,發送計算請求并接收結果。

      結果輸出

      遠程服務端輸出結果:

      Server is running...

      執行的操作:add

      執行結果:15

      執行的操作:subtract

      執行結果:5

      客戶端輸出結果

      add 執行結果: 15

      subtract 執行結果: 5

      遠程代理的應用

      比如:Apache CXF 服務框架

      import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
      
      public class Client {
          public static void main(String[] args) {
              JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
              factory.setServiceClass(HelloWorldService.class);
              factory.setAddress("http://localhost:8080/hello");
              HelloWorldService service = (HelloWorldService) factory.create();
              System.out.println(service.sayHello("World"));
          }
      }
      

      配置服務接口class和服務路由,通過工廠模式創建對應的遠程代理實例化對象,客戶端只需要關注接口有什么方法即可,調用遠程服務方法就像是調用本地方法一樣。

      比如:RPC協議框架,例如:dubbo、gRPC等。

      總結

      通過這種實現,您可以模擬一個基于 Socket 的遠程服務和遠程代理的應用。客戶端通過 RemoteCalculationServiceProxy 與遠程服務進行通信,而遠程服務通過RemoteCalculationServiceImpl 提供計算功能。客戶端在使用代理對象進行操作時,就像是調用本地的方法一樣,無感的實現遠程方法的調用。這種調用方式又稱為遠程過程調用。常用的遠程過程調用框架有CXF、Dubbo、gRPC等等,其核心思想之一都是遠程代理,它實現了在本地調用遠程服務時的透明性,使得遠程調用看起來像本地調用。

      image

      需要查看往期設計模式文章的,可以在個人主頁中或者文章開頭的集合中查看,可關注我,持續更新中。。。


      超實用的SpringAOP實戰之日志記錄

      2023年下半年軟考考試重磅消息

      通過軟考后卻領取不到實體證書?

      計算機算法設計與分析(第5版)

      Java全棧學習路線、學習資源和面試題一條龍

      軟考證書=職稱證書?

      軟考中級--軟件設計師毫無保留的備考分享

      posted @ 2025-01-14 09:30  淵渟岳  閱讀(472)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产粉嫩高中无套进入| 国产精品无遮挡猛进猛出| 国模无吗一区二区二区视频| 免青青草免费观看视频在线| 中国熟女仑乱hd| 精品亚洲一区二区三区在线观看| 日韩一区二区三区在线观院| 99九九成人免费视频精品| 安西县| 人妻无码久久精品| 桃花岛亚洲成在人线AV| 午夜天堂一区人妻| 亚洲伊人久久大香线蕉| 国产精品一区在线免费看| 成人看的污污超级黄网站免费| 性色av无码久久一区二区三区| 国内熟妇人妻色在线视频| 呻吟国产av久久一区二区| 中文字幕在线国产精品| 激情综合网一区二区三区| 浮妇高潮喷白浆视频| 英德市| 巨熟乳波霸若妻在线播放| 东京热大乱系列无码| 亚洲成av人片无码迅雷下载| 国产99久久精品一区二区| 亚洲av午夜福利精品一区二区| 久在线精品视频线观看| 国产免费高清69式视频在线观看| 中文字幕乱码熟女人妻水蜜桃| 黄色舔女人逼一区二区三区| 无码国模国产在线观看免费| 人妻蜜臀久久av不卡| 亚洲国产精品无码一区二区三区| 免费现黄频在线观看国产| 狠狠色丁香婷婷综合尤物| 国产日产欧产精品精品| 国产成人亚洲综合图区| 91久久亚洲综合精品成人| 日本精品aⅴ一区二区三区| 欧美牲交a欧美牲交aⅴ免费|