当前位置: 首页 > 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…...

【Flutter3.8x】flutter从入门到实战基础教程(一):新建一个flutter项目

初始化项目步骤 vscode中安装flutter插件ctrlshiftp弹出命令框点击flutter:new project系统会自动生成一个项目&#xff0c;其中会让选择一个文件夹存放源码&#xff0c;自行选择就行 启动安卓模拟器把文件定位在main.dart上&#xff0c;然后再点击这里如果启动失败&#xff0c…...

在电脑上免费畅玩Switch游戏:Ryujinx模拟器终极完整指南

在电脑上免费畅玩Switch游戏&#xff1a;Ryujinx模拟器终极完整指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是否曾梦想在电脑上体验《塞尔达传说&#xff1a;王国之泪》的壮…...

2026脑机接口:技术突破与产业爆发

2026年脑机接口技术的发展现况 2026年&#xff0c;脑机接口技术已从实验室前沿研究加速迈向产业化与规模化应用的关键节点&#xff0c;其发展现况呈现出“技术突破、场景深化、生态初成”的鲜明特征。 一、 技术路线&#xff1a;侵入式与非侵入式并行突破&#xff0c;性能边界…...

ncmdump:网易云NCM音乐解密转换终极指南

ncmdump&#xff1a;网易云NCM音乐解密转换终极指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字音乐时代&#xff0c;网易云音乐的NCM加密格式成为众多音乐爱好者的使用障碍。ncmdump作为一款高效的开源解密工具&#xff…...

【NotebookLM视频转文字实战指南】:20年AI工程师亲测的5大避坑技巧与98.7%准确率实现路径

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM视频转文字的核心原理与能力边界 NotebookLM 的视频转文字功能并非直接处理原始视频流&#xff0c;而是依赖 Google Cloud Speech-to-Text API 的增强版语音识别管道&#xff0c;并结合 YouT…...

Wi-Wi:2026 年 NAB 展亮点,实现皮秒级时间同步与毫米级距离测量!

Wi-Wi&#xff1a;实现 1 纳秒级无线时间同步2026 年 5 月 19 日&#xff0c;在 NAB 展会上&#xff0c;能看到 [Wi-Wi STAMP] 的演示。Wi-Wi STAMP 是一种无线时间同步协议&#xff0c;源自日本国立信息通信技术研究所&#xff08;NICT&#xff09;。Wi-Wi 技术特点Wi-Wi 即 W…...

物理学巅峰成就巡礼:从牛顿到量子,探索宇宙与微观世界的革命性突破

1. 项目概述&#xff1a;一次对物理学巅峰成就的巡礼2019年&#xff0c;诺贝尔物理学奖授予了三位天体物理学家——詹姆斯皮布尔斯、米歇尔马约尔和迪迪埃奎洛兹&#xff0c;以表彰他们在物理宇宙学理论以及系外行星发现领域的开创性贡献。这个奖项像一束聚光灯&#xff0c;将公…...

VideoDownloadHelper终极指南:技术开发者必备的Chrome视频下载插件

VideoDownloadHelper终极指南&#xff1a;技术开发者必备的Chrome视频下载插件 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper VideoDownload…...

终极ncmdump工具完整指南:3分钟快速解密NCM格式音乐文件

终极ncmdump工具完整指南&#xff1a;3分钟快速解密NCM格式音乐文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的歌曲只能在特定播放器里播放而烦恼吗&#xff1f;ncmdump工具为你提供完美的解决方案&…...

冬日狂想曲(赠去马赛克补丁)2026最新官方正版免费下载 一键转存 永久更新 (看到速转存 资源随时走丢)

下载链接 独立像素游戏的设计范式&#xff1a;以《冬日狂想曲》为例的机制与架构分析 在当代独立游戏开发领域&#xff0c;微型箱庭&#xff08;Miniature Sandbox&#xff09;与时间管理机制的结合&#xff0c;正逐渐成为中小型社团实现“低成本、高粘度”叙事的重要手段。作…...