当前位置: 首页 > news >正文

️RPC协议 --基于TCP实现RPC通信

RPC 协议介绍

RPC(Remote Procedure Call,远程过程调用)协议是一种通信协议,允许一个程序调用另一个地址空间(通常是在网络上)的过程或函数,而不需要显式地处理细节如数据序列化和网络通信。它允许开发人员编写分布式应用程序,就像编写本地应用程序一样。
关键特点和组成部分

  1. Stub(存根)和 Skeleton(骨架)
    • Stub:在客户端和服务器端之间,Stub负责序列化参数并将其发送到远程服务器,然后等待并接收服务器的响应并反序列化结果。
    • Skeleton:在服务器端,Skeleton接收来自Stub的请求,反序列化参数,调用本地过程或函数,然后将结果序列化并返回给Stub。
  2. 序列化和反序列化
    • RPC系统通常需要在客户端和服务器之间传输数据,因此需要将数据序列化为网络可传输的格式(如JSON、XML、Protocol Buffers等),然后在接收端进行反序列化。
  3. 远程对象调用
    • RPC允许客户端调用远程服务器上的对象或服务中的方法,就像调用本地对象一样,屏蔽了网络和通信的细节。
  4. 通信协议
    • RPC可以基于不同的传输协议实现,如HTTP、TCP、UDP等,常见的RPC框架包括gRPC、Apache Thrift、CORBA等,它们提供了不同的特性和性能优化。

实现方式
RPC协议的实现可以基于以下步骤:

  1. 定义接口:定义需要远程调用的接口,包括参数和返回类型。
  2. 生成代码:使用RPC框架提供的工具生成客户端和服务器端的Stub和Skeleton代码。
  3. 实现服务:在服务器端实现接口定义的方法。
  4. 配置和部署:配置RPC框架使用的传输协议、序列化方式等,并部署服务和客户端。

基于 TCP 的 RPC 协议实现

基于TCP实现简单的RPC(Remote Procedure Call,远程过程调用)协议涉及多个步骤:

  1. 建立基本的通信框架、
  2. 序列化/反序列化数据、
  3. 定义协议消息格式、
  4. 实现客户端和服务器端的Stub(存根)和Skeleton(骨架)。

以下是一个简单的示例,展示如何基于C语言使用TCP套接字实现RPC协议。

实现步骤

  1. 定义协议消息格式:定义客户端和服务器之间通信的消息格式。
  2. 序列化和反序列化:将数据序列化为网络可传输的格式,然后在接收端进行反序列化。
  3. 建立服务器端:实现服务器端,处理客户端的请求。
  4. 建立客户端:实现客户端,向服务器端发送请求并接收响应。

实现示例

1. 定义协议消息格式

假设我们的RPC协议非常简单,仅支持一个加法操作,客户端发送两个整数到服务器端,服务器端计算结果后返回给客户端。

// 定义RPC请求消息
typedef struct {int num1;int num2;
} RpcRequest;// 定义RPC响应消息
typedef struct {int result;
} RpcResponse;

2. 服务器端实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>#define PORT 5000
#define BUFFER_SIZE 1024// 处理RPC请求的函数
void handleRpcRequest(int client_socket) {RpcRequest request;RpcResponse response;// 接收请求int bytes_received = recv(client_socket, &request, sizeof(request), 0);if (bytes_received < 0) {perror("Error receiving request");close(client_socket);return;}// 处理请求(这里简单处理,假设执行加法操作)response.result = request.num1 + request.num2;// 发送响应int bytes_sent = send(client_socket, &response, sizeof(response), 0);if (bytes_sent < 0) {perror("Error sending response");}// 关闭套接字close(client_socket);
}int main() 
{int server_socket, client_socket;struct sockaddr_in server_addr, client_addr;socklen_t client_len = sizeof(client_addr);// 创建套接字server_socket = socket(AF_INET, SOCK_STREAM, 0);if (server_socket < 0) {perror("Error opening socket");exit(EXIT_FAILURE);}// 设置服务器地址结构memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(PORT);// 绑定套接字if (bind(server_socket

相关文章:

️RPC协议 --基于TCP实现RPC通信

RPC 协议介绍 RPC(Remote Procedure Call,远程过程调用)协议是一种通信协议,允许一个程序调用另一个地址空间(通常是在网络上)的过程或函数,而不需要显式地处理细节如数据序列化和网络通信。它允许开发人员编写分布式应用程序,就像编写本地应用程序一样。 关键特点和组…...

android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion

1、先明白几个概念 &#xff08;1&#xff09;平台版本&#xff08;Android SDK版本号&#xff09; 平台版本也就是我们平时说的安卓8、安卓9、安卓10 &#xff08;2&#xff09;API级别&#xff08;API Level&#xff09; Android 平台提供的框架 API 被称作“API 级别” …...

Redis缓存穿透、击穿和雪崩的理解和解决思路

Redis的缓存穿透 缓存穿透是指那些查询请求所要获取的数据既不在缓存&#xff08;Redis&#xff09;中&#xff0c;也不在数据库&#xff08;例如&#xff1a;MySQL&#xff09;中&#xff0c;因此每次请求都会直接访问数据库。这种情况通常由以下几种情形引起&#xff1a; 恶…...

ReactHooks(完结)

上期戳here ReactHooks[三] 一.memo 函数1.1 语法格式 二. useMemo2.1 问题引入2.2 语法格式2.3 使用 useMemo 解决刚才的问题 三.useCallback3.1 useMemo和useCallback区别3.2 语法格式 四.useTransition4.1 问题引入4.2 语法格式4.3 使用 isPending 展示加载状态4.4 注意事项…...

【数据中台】大数据管理平台建设方案(原件资料)

建设大数据管理中台&#xff0c;按照统一的数据规范和标准体系&#xff0c;构建统一数据采集&#xfe63;治理&#xfe63;共享标准、统一技术开发体系、统一接口 API &#xff0c;实现数据采集、平台治理&#xff0c;业务应用三层解耦&#xff0c;并按照统一标准格式提供高效的…...

UE5+OpenCV配置(Windows11系统)

一、概述 因为需要在UE5中使用OpenCV这些工具进行配置&#xff0c;所以在网络上参考借鉴一些资料进行配置。查询到不少的资料&#xff0c;最后将其配置成功。在这里顺便记录一下自己的配置成功的过程。 二、具体过程 &#xff08;一&#xff09;版本 使用Windows11系统、UE5.…...

自研Vue3开源Tree组件:节点拖拽bug修复

当dropType为after&#xff0c;且dropNode为父节点时&#xff0c;bug出现了&#xff1a; bug原因&#xff1a;插入扁平化列表的位置insertIndex计算的不对&#xff1a; 正确的逻辑&#xff0c;同inner要算上子孙节点所占的位置&#xff1a; bug修复&#xff01;...

SSM学习9:SpringBoot简介、创建项目、配置文件、多环节配置

简介 SpringBoot式用来简化Spring应用的初始搭建以及开发过程的一个框架 项目搭建 File -> New -> Project 选中pom.xml文件&#xff0c;设置为maven项目 项目启动成功 可以访问BasicController中的路径 配置文件 在resources目录下 application.properties 默…...

Java面试题---索引

什么是索引 索引是用来高效获取数据的存储结构如同字典的目录一样&#xff0c;数据库的索引通常使用btree来实现&#xff0c;索引树的节点和数据地址相关联&#xff0c;查询的时候在索引树种进行高效搜索&#xff0c;然后根据数据地址获取数据。索引提高了搜索的效率同时增加了…...

ollama本地部署大语言模型记录

目录 安装Ollama更改模型存放位置 拉取模型GemmaMistralQwen1.5(通义千问)codellama 部署Open webui测试性能知识广度问题1问题2 代码能力总结 最近突然对大语言模型感兴趣 同时在平时的一些线下断网的CTF比赛中&#xff0c;大语言模型也可以作为一个能对话交互的高级知识检索…...

【C++红黑树应用】模拟实现STL中的map与set

目录 &#x1f680; 前言一&#xff1a; &#x1f525; 红黑树的修改二&#xff1a; &#x1f525; 红黑树的迭代器 三&#xff1a; &#x1f525; perator() 与 operator--() 四&#xff1a; &#x1f525; 红黑树相关接口的改造✨ 4.1 Find 函数的改造✨ 4.2 Insert 函数的改…...

前端实习手计(5):班味十足?!

自我感觉没有班味&#xff01;&#xff01;&#xff01;每天还是快快乐乐上班哇&#xff0c;是愉快的一周~这周没有太多活咯&#xff0c;基本就是修修改改改代码学习。真的感觉自己写的代码就是乱七八糟&#xff0c;只要能跑起来有效果就行&#xff08;我不是合格的处女座哈哈哈…...

Duix AI 太上瘾,让我熬夜体验的AI女友

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; Duix AI 太上瘾&#xff0c;让我熬夜体验的AI女友 开启 Duix AI 女友的奇妙之旅_ Hi&#xff0c;这…...

php判断某个目录下是否存在文件

/*** 判断字符串是否以什么结尾* param String $haystack 字符串* param String $needle 结尾* return Boolean*/ function endWith($haystack, $needle) {$length strlen($needle);if ($length 0) {return true;}return (substr($haystack, -$length) $needle); } /***…...

重塑互联网生态:探索Web 3.0、大数据与隐私保护的新篇章

引言&#xff1a;互联网的新纪元 随着互联网技术的日新月异&#xff0c;我们正迈入一个全新的时代&#xff0c;其中Web 3.0、大数据以及隐私保护成为塑造未来互联网生态的三大核心力量。它们不仅改变了我们与互联网交互的方式&#xff0c;更深刻地影响着社会的方方面面。 Web…...

HR模块中PA信息类型的相关函数

目录 1、新增、删除&#xff0c;修改&#xff1a;HR_INFOTYPE_OPERATION新增&#xff1a;INS删除&#xff1a;DEL修改&#xff1a;MOD 2、读取PA信息类型&#xff1a;HR_READ_INFOTYPE3、入职&#xff0c;生成新工号用&#xff1a;HR_PAD_HIRE_EMPLOYEE4、加锁&#xff1a;BAPI…...

c# 日期类型变量默认值

DateTime类型是比较常用的变量类型&#xff0c;但是以前处理都比较业余&#xff0c;下面总结2中常用方式 这次把它总结下&#xff1a; DateTime t1 default(DateTime); DateTime t2 DateTime.MinValue; 这样t1&#xff0c;t2 的值都是 {0001/1/1 0:00:00} PS: 由于DateTi…...

设计模式实战:任务调度系统的设计与实现

问题描述 设计一个任务调度系统,支持任务的创建、调度、执行和状态管理。系统需要确保任务的执行过程可以被灵活调度,并且支持任务状态的跟踪和通知功能。 设计分析 命令模式 命令模式用于将请求封装成对象,从而使我们可以用不同的请求、队列或日志来参数化其他对象。任…...

代码中的特殊注释

代码中特殊注释——TODO、FIXME、XXX、HACK_fix me todo hack-CSDN博客 代码中特殊注释——TODO、FIXME、XXX、HACK TODO&#xff1a;英语翻译为待办事项&#xff0c;备忘录。如果代码中有该标识&#xff0c;说明在标识处有功能代码待编写&#xff0c;待实现的功能在说明中会…...

ubuntu20.04.6 安装Skywalking 10.0.1

1.前置准备 1.1. **jdk17&#xff08;Skywalking10 jdk22不兼容&#xff0c;用17版本即可&#xff09;**安装&#xff1a; https://blog.csdn.net/CsethCRM/article/details/140768670 1.2. elasticsearch安装&#xff1a; https://blog.csdn.net/CsethCRM/article/details…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...