用远程代理模式轻松实现远程服务调用,打开编程新大门
通过远程代理来实现一个简易的远程过程调用实例。带你打开新的大门。
Socket 远程代理服务案例
基于 Socket 的远程服务,我们需要完成以下步骤:
-
服务端实现:创建一个远程服务,通过 Socket 接受客户端请求并提供计算服务。
-
客户端实现:客户端通过代理类访问远程计算服务,代理通过网络与服务器交互。
-
代理类:代理类会通过网络与服务器建立连接,转发请求并返回响应。
看下案例类图应该就明白了
案例类图
客户端和服务端都共有服务接口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 {@Overridepublic int add(int a, int b) {return a + b;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic int add(int a, int b) {return sendRequest("add", a, b);}@Overridepublic 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等等,其核心思想之一都是远程代理,它实现了在本地调用远程服务时的透明性,使得远程调用看起来像本地调用。
文章转载自:渊渟岳
原文链接:用远程代理模式轻松实现远程服务调用,打开编程新大门 - 渊渟岳 - 博客园
体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构
相关文章:
用远程代理模式轻松实现远程服务调用,打开编程新大门
通过远程代理来实现一个简易的远程过程调用实例。带你打开新的大门。 Socket 远程代理服务案例 基于 Socket 的远程服务,我们需要完成以下步骤: 服务端实现:创建一个远程服务,通过 Socket 接受客户端请求并提供计算服务。 客户端…...
(001)Excel 快捷键
文章目录 时间 时间 当前日期:ctrl ; (分号)。当前时间:ctrl Shift ; (分号)。...
TMI投稿指南(二):投稿文章注意事项
文章结构: https://journals.ieeeauthorcenter.ieee.org/create-your-ieee-journal-article/create-the-text-of-your-article/structure-your-article/ 补充材料:准备补充材料 - IEEE 作者中心期刊 --- Prepare Supplementary Materials - IEEE Author…...
从困局到破局的AI+数据分析
从困局到破局的AI数据分析 困局:数据分析的四道高墙破局:AI赋能全流程数据分析远见:AI数据分析的革命性意义 数据是新时代的石油,人工智能是炼油厂。当两者强强联合,一场数据分析的革命正悄然发生。 多少次你面对Excel…...
12. RANSAC点云多平面拟合分割
本文看了博客RANSAC点云多平面拟合分割-CSDN博客的文章,该博客将多平面拟合分割讲的很详细了,这里只是作为笔记用。 1.RANSAC算法原理 三维平面拟合(最小二乘法) 具体实现见下面代码: def SVD(points):# 二维&#…...
Prompt
提示工程指南 | Prompt Engineering GuideGoogle 官方提示工程 (Prompt Engineering)白皮书 | 宝玉的分享https://www.geeksforgeeks.org/what-is-prompt-engineering-the-ai-revolution/Prompt Engineering for Reasoning ModelsPrompt Engineering with Reasoning Models 1.p…...
[特殊字符] SpringCloud项目中使用OpenFeign进行微服务远程调用详解(含连接池与日志配置)
📚 目录 为什么要用OpenFeign? 在cart-service中整合OpenFeign 2.1 引入依赖 2.2 启用OpenFeign 2.3 编写Feign客户端 2.4 调用Feign接口 开启连接池,优化Feign性能 3.1 引入OkHttp 3.2 配置启用OkHttp连接池 3.3 验证连接池生效 Feign最佳…...
迈瑞医疗:国际业务增长21.28% 发展中国家成重要增长引擎
4月28日,迈瑞医疗(300760.SZ)发布2024年年度报告。报告期内,公司实现营业收入367.26亿元,同比增长5.14%;实现归母净利润116.68亿元,同比增长0.74%;经营活动产生的现金流量净额124.25…...
「地平线」创始人余凯:自动驾驶尚未成熟,人形机器人更无从谈起
温馨提示:运营团队2025年最新原创报告(共210页) —— 正文: 近日,国内智驾芯片上市公司[地平线]创始人兼CEO余凯(先生)接受腾讯新闻访谈时,提到如今大火的人形机器人,核…...
R 语言科研绘图第 43 期 --- 桑基图-冲击
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.weixin.qq.c…...
SpringBoot应用原生或docker镜像容器集成Skywalking
相关组件及版本 序号 组件 版本 备注 1 skywalking-oap-server 8.9.1 2 elasticsearch 7.17.6 3 skywalking-ui 8.9.1 4 apache-skywalking-java-agent 8.15.0 一、JAR包方式部署服务 下载apache-skywalking-java-agent jar文件 使用如下名称执行 java \ -j…...
模板--进阶
1. 非类型模板参数 模板解决了两类问题 1控制数据类型 2控制某种设计逻辑 类域可以直接访问什么? 1static修饰的静态成员变量 2typedef定义的内嵌类型 3 内部类 下面我们就要引出一个模板的知识点----------再用类模板的时候从类模板里面去取东西的时候 要…...
PostgreSQL无法查看表中数据问题排查
在 PostgreSQL 中,恢复数据库后,使用 DBeaver 等工具可以看到数据库和表名,但无法查询到表中数据,可能是以下原因之一。以下是可能的原因和解决方法: 1. 恢复未完全成功 原因:数据库恢复过程中可能未完全成…...
实验研究 | 千眼狼高速摄像机驱动精密制造创新
研究背景 小模数齿轮作为精密制造领域的核心组件,以“结构紧凑、重量轻、精度高”等优势,广泛应用于航空航天、工业机器人、精密仪器、医疗设备、新能源和微电机等领域。传统抛光技术效率低、成本高、表面质量不足,电解等离子体抛光技术&am…...
AWS虚拟专用网络全解析:从基础到高级实践
导语 AWS虚拟专用网络是连接企业本地数据中心与AWS云环境的关键桥梁。本文将深入探讨AWS VPN的核心概念、配置方法、最佳实践以及常见问题解决方案,助您构建安全、可靠的混合云网络架构。 一、AWS VPN概述 1. 定义 AWS VPN是一种网络服务,允许用户通过加密隧道将本地网络…...
工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能
工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能 北京海特伟业科技有限公司任洪卓发布于2025年4月28日 在数字化转型浪潮下,IP应急广播呼叫对讲广播系统凭借其网络化、智能化、融合化、多元化等优势,已…...
我的HTTP和HTTPS
注释:本文章架构跟随小林coding,在此基础上加深个人理解 小林coding:https://xiaolincoding.com/network/2_http/http_interview.html HTTP基本概念 HTTP是什么? http的中文名是超文本传输协议,超文本就是html&…...
python_股票月数据趋势判断
目录 前置 代码 视频&月数据 前置 1 A股月数据趋势大致判断,做一个粗略的筛选 2 逻辑: 1)取最近一次历史最高点 2)以1)中最高点为分界点,只看右侧数据,取最近一次最低点 3…...
计算机考研精炼 计网
第 19 章 计算机网络体系结构 19.1 基本概念 19.1.1 计算机网络概述 1.计算机网络的定义、组成与功能 计算机网络是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。 …...
大数据应用开发和项目实战-Matplotlib
Matplotlib的介绍 Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。 Matplotlib 可以用来绘制各种静态,动态,交互式的图表。比如说散点图、柱状图等等。 Matplotlib的安装与…...
SQLMesh CLI 实战教程: 构建和维护数据转换管道的快速指南
在数据工程领域,构建和维护数据转换管道是一项复杂而关键的任务。SQLMesh 是一个强大的工具,可以帮助你简化这一过程。本文将带你快速了解如何使用 SQLMesh CLI 来构建和维护数据转换管道。本文的目标是在 30 分钟或更短的时间内,让你熟悉 SQ…...
行政区划代码
本文数据来源:中华人民共和国民政部 在平常数据研究和开发中,经常会用到行政区划代码。而行政区划代码的使用,因年份不同可能也不尽完全相同。故整理了1980年到2024年所有的行政区划代码。 这样不仅仅适用于研究区划代码的变更研究…...
Spring生命周期
在Spring框架中,Bean的生命周期指的是从Bean的创建到销毁的整个过程。这个过程包括了多个阶段,每个阶段都有特定的操作。下面是一个典型的Spring Bean生命周期的概述: 一. 实例化(Instantiation) 当Spring容器启动时&…...
前端连接websocket服务报错 Unexpected response code: 301
前端连接websocket服务报错 Unexpected response code: 301 引直连测试301重定向修改nginx配置 引 websocket后端服务正常,监听正常,可以通过简单的前端代码进行连接,但是通过nginx反向代理后报错Error during WebSocket handshake: Unexpec…...
C语言(5)—操作符详解
文章目录 一、操作符分类概览二、二进制与进制转换2.1 进制基本概念 三、原码、反码与补码3.1 基本概念 四、位操作符详解 一、操作符分类概览 C语言中的操作符可以分为以下几大类: 算术操作符:, -, *, /, % 移位操作符:<<, >>…...
ubuntu新增磁盘挂载
1. 确认新磁盘 使用 lsblk 命令查看系统中所有的块设备,找出新增的磁盘。 rootzzwl:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 60G 0 disk ├─sda1 8:1 0 …...
【计网】计算机网络的类别与性能
一、计算机网络的分类 计算机网络可以根据不同的标准进行分类。下面是两种常见的分类方法: 1.按照网络的作用范围进行分类 广域网 (WAN): 广域网覆盖的范围非常广泛,通常跨越城市、国家或甚至是全球。WAN主要用于连接地理位置相隔较远的计算机和网络设…...
Field访问对象int字段,对象访问int字段,通过openjdk17 C++源码看对象字段访问原理
在Java反射机制中,访问对象的int类型字段值(如field.getInt(object))的底层实现涉及JVM对内存偏移量的计算与直接内存访问。本文通过分析OpenJDK 17源码,揭示这一过程的核心实现逻辑。 一、字段偏移量计算 1. Java层初始化偏移量…...
香橙派打包qt文件报错“xcb 插件无法加载”与“QObject::moveToThread”线程错误的解决方案
PyQt 报错总结:打包文件过程,“xcb 插件无法加载”与“QObject::moveToThread”线程错误的解决方案全解析 在使用 PyQt5 搭建图形界面时,打包文件的过程中出现的问题,真难绷,搞了半天。 Qt 平台插件 xcb 无法加载QOb…...
Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理
Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理 目录 Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理 一、简单介绍 二、在同一个布局中同时显示 Androi…...
在android 系统上qnn sdk转换,运行模型示例
前面讲了如何配置qnn sdk的环境,这一篇总结下qnn 实际转换一个onnx 模型,并运行的实现步骤。 设备: 1. ubuntu22.04 的Linux 服务器。 2. 一台android手机。 一、下载模型 from optimum.onnxruntime import ORTModelForSequenceClassifi…...
docker安装Canal1.1.5,MySQL5.7踩坑
docker安装Canal 前情提示安装MySQLdocker安装MySQL1. 拉取镜像2. 创建容器映射宿主机目录3. docker run 配置mysql重启mysql新建canal用户 安装Canal创建docker网络安装Canal1.拉取canal镜像2.创建目录3.运行容器 踩坑问题1 前情提示 关于版本问题,官方也没有详细…...
SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换
介绍 Spring Boot通过MessageSource接口来实现国际化,它可以加载不同的消息资源文件,通常是.properties格式。通过定义不同的语言文件(例如:messages_en.properties、messages_zh.properties等),可以根据用…...
C++ 嵌套类 (详解 一站式讲解)
目录 嵌套类 嵌套类的定义 嵌套类结构的访问权限 pimpl模式(了解) 嵌套类 嵌套类的定义 首先介绍两个概念: 类作用域(Class Scope) 类作用域是指在类定义内部的范围。在这个作用域内定义的成员(包括…...
EasyCVR视频汇聚平台助力大型生产监控项目摄像机选型与应用
一、方案背景 在300路大型生产监控项目中,由于生产环境复杂多样,涵盖室外厂区、大型车间、室内办公区域等不同场景,单一类型的摄像机难以满足全方位、精细化的监控需求。EasyCVR作为一款功能强大的视频融合管理平台,具备灵活的视…...
解决leensa无法使用的办法:平替教程
Leensa已经完全连不上,并显示超时,至于之前有传言称他们会恢复服务也完全是无稽之谈。 那么,Leensa停止服务后,广大的外贸人,设计人,留学生以及技术人学习,查资料以及开发客户该怎么办呢&#…...
算法思想之哈希表
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之哈希表 发布时间:2025.4.28 隶属专栏:算法 目录 算法介绍哈希表作用什么时候使用哈希表怎么使用哈希表 例题两数之和题目链接题目描述算法思路代码实现 判定是否互为字符重排题目链…...
springboot 视频分段加载在线播放
页面访问视频资源 前端播放加载部分视频,每次选中一个时间点后 往后加载一部分视频,主要用以节省网络传输的数据量 通过ResourceHttpRequestHandler类实现,ResourceHttpRequestHandler支持分片加载,前端请求头中携带Range: bytes 0-10001,就…...
【题解-Acwing】868. 筛质数
题目:868. 筛质数 题目描述 给定一个正整数 n,请你求出 1∼n 中质数的个数。 输入 共一行,包含整数 n。 输出 共一行,包含一个整数,表示 1∼n 中质数的个数。 数据范围 1 ≤ n ≤ 106 时空限制 0.2s / 64MB 输入样例 8输出样例 4代码 #include...
java 和 C#操作数据库对比
Java和C#在操作数据库方面有诸多相似之处,但也存在一些差异,以下从几个方面为你进行对比: 数据库连接 Java 在Java中,使用JDBC(Java Database Connectivity)来连接数据库。连接数据库的步骤通常包括加载…...
用 Python打造交互式图片-音视频管理器:代码分析与实践
在 Python 的 GUI 开发领域,wxPython 是一个功能强大且跨平台的框架,适合快速构建桌面应用程序。本文将深入分析一个基于 wxPython 的交互式图片管理器项目(SelectModelToPlayVideoAndAudio.py),该程序允许用户管理图片…...
Django 缓存框架
动态网站的一个基本权衡是它们是动态的。每当用户请求页面时,Web 服务器进行各种计算,从数据库查询到模板渲染到业务逻辑,以创建您网站访问者看到的页面。从处理开销的角度来看,这比标准的从文件系统中读取文件的服务器安排要昂贵…...
后缀数组~
子串:在字符串s中,取任意i<j,那么在s中截取从i到j的这一段就叫做s的一个子串。 后缀:后缀就是从字符串的某个位置i到字符串末尾的子串,我们定义以s的第i个字符为第一个元素的后缀为suff(i)。 suff(1)就是从第一个字符到最后一个…...
Rust 学习笔记:编程练习(一)
Rust 学习笔记:编程练习(一) Rust 学习笔记:编程练习(一)Convert temperatures between Fahrenheit and CelsiusGenerate the nth Fibonacci numberPrint the lyrics to the Christmas carol “The Twelve …...
【基础知识】常见的计算公式(一)
目录标题 定时器相关公式1. 定时器分频系数计算2. 定时器定时时间计算 波特率相关公式1. 异步串行通信波特率计算 PWM 相关公式1. PWM 占空比计算 不知道你们是不是和我一样,对定时器中的分频系数相关的计算公式,波特率计算公式等,都有点心生畏惧,其核心原因是不清楚不了解,没有…...
【AI生产力工具】Windsurf,一款AI编程工具
Windsurf 是 Codeium 公司推出的一款 AI 编程助手,它是一款集成深度上下文感知、多模型协作和实时代码管理的综合开发环境(IDE)。 Windsurf 作为 AI 编程工具的核心价值在于 “上下文感知 + 多模型协作 + 自动化工作流”,其深度集成的智能体系统(如 Flows 和 Cascade)正…...
【网络原理】TCP提升效率机制(三):延时应答和捎带应答
目录 一. 延时应答 二. 捎带应答 一. 延时应答 延时应答也是基于滑动窗口的一种提升传输效率的方式(减少ACK数量) 接收方收到数据之后,不会立刻返回一个ACK确认报文,而是等一会再返回ACK报文 这样做的好处? 1&…...
Golang|分布式索引架构
当文档数量巨大时,如一亿个文档,倒排索引难以全部放入单机内存。正排索引将热数据和冷数据分别存储在内存和磁盘中。分布式搜索引擎将数据分布在不同服务器上以应对大量数据。 倒排索引的水平切分 水平切分按关键词划分数据,如JAVA和算法在A服…...
【蓝桥杯省赛真题58】Scratch画台扇 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
目录 scratch画台扇 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 四、程序编写 五、考点分析 六、推荐资料 1、scratch资料 2、python资料 3、C资料 scratch画台扇 第十五届青少年蓝桥杯scratch编程省赛真题解析 一…...
WebRTC SDK是什么?
语音环境每年都在变,OKCC以前代理商的客群都是简单高效外呼为主,今年发现变化很大。很多代理商做的终端客户都是给其他业务系统赋能为主了。主流的还是以API对接为主,但是对接中发现webrtc SDK使用频率很高。 那么什么是WebRTC SDK…...