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

新手避坑指南:51单片机驱动ADC0809的五个常见问题及解决方法(附Proteus调试技巧)

51单片机与ADC0809实战避坑手册&#xff1a;从仿真异常到显示优化的全流程解析 第一次在Proteus里搭建51单片机驱动ADC0809的仿真环境时&#xff0c;看着屏幕上跳动的乱码和永远为零的电压读数&#xff0c;我盯着电路图反复检查了三遍引脚连接——所有线序明明完全正确。这种挫…...

告别公式迁移难题:3步实现LaTeX到Word的无缝转换体验

告别公式迁移难题&#xff1a;3步实现LaTeX到Word的无缝转换体验 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 问题溯源&#xff1a;学术公式迁…...

构建稳定爬虫服务:基于快马ai生成openclaw的windows生产级部署实战

构建稳定爬虫服务&#xff1a;基于快马AI生成OpenClaw的Windows生产级部署实战 最近在做一个数据采集项目&#xff0c;需要将OpenClaw爬虫部署到Windows服务器上长期运行。经过一番折腾&#xff0c;终于通过InsCode(快马)平台生成了一个完整的生产级部署方案&#xff0c;这里分…...

​如何选择专业的液晶面板废气治理厂家

从智能手机到超高清大屏&#xff0c;液晶面板已成为信息时代不可或缺的核心组件。然而&#xff0c;在其精密制造过程中&#xff0c;光刻、显影、刻蚀等工序会产生大量成分复杂的有机废气、酸性气体及含尘废气。随着环保标准日益严格及面板厂产能不断扩张&#xff0c;【液晶面板…...

从‘发快递’到‘收快递’:手把手拆解RocketMQ 5.x中Group、Topic、Queue的实战配置与避坑指南

从‘发快递’到‘收快递’&#xff1a;手把手拆解RocketMQ 5.x中Group、Topic、Queue的实战配置与避坑指南 想象一下你正在搭建一个电商系统&#xff0c;订单创建后需要实时通知库存服务扣减库存、支付服务生成账单、物流服务准备发货。这种异步解耦的场景正是消息队列的用武之…...

安防相机WDR功能实测:逆光场景下如何拍清车牌和人脸?

安防相机WDR功能实战解析&#xff1a;逆光场景下的车牌与人脸清晰拍摄指南 停车场出入口的监控画面中&#xff0c;一辆黑色轿车缓缓驶过&#xff0c;阳光从车尾方向直射镜头&#xff0c;车牌区域瞬间变成一片刺眼的白光——这是安防工程中最令人头疼的逆光场景。现代宽动态范围…...

GBase 8c 表空间规划和对象迁移

GBase 8c 表空间规划和对象迁移 我最近看 GBase 8c 资料时&#xff0c;越来越强烈的一个感觉是&#xff1a;很多现场不是不会建表空间&#xff0c;而是把表空间用得太晚、太散、太随意。 真正落到现场时&#xff0c;最常见的现象通常不是“不会执行 CREATE TABLESPACE”&#x…...

django-unfold过滤器系统完全解析:实现高效数据筛选的终极技巧

django-unfold过滤器系统完全解析&#xff1a;实现高效数据筛选的终极技巧 【免费下载链接】django-unfold Modern Django Admin 项目地址: https://gitcode.com/gh_mirrors/dj/django-unfold django-unfold过滤器系统是Modern Django Admin框架中提升数据管理效率的核心…...

避开SAP记账第一个坑:F-02凭证录入的5个细节与FS10N对账技巧

SAP财务实操避坑指南&#xff1a;F-02凭证录入的5个关键细节与FS10N高效对账技巧 刚接触SAP FI模块的中级用户&#xff0c;往往在完成基础培训后信心满满地开始独立操作&#xff0c;却在F-02凭证录入时频频踩坑。这些看似简单的字段选择背后&#xff0c;隐藏着财务逻辑与系统设…...

数据仓库进阶:缓慢变化维度(SCD)完全解析

数据仓库进阶&#xff1a;缓慢变化维度&#xff08;SCD&#xff09;完全解析1. 缓慢变化维度概述1.1 什么是SCD&#xff1f;1.2 为什么需要SCD&#xff1f;2. SCD处理流程图3. 常见SCD类型详解3.1 Type 0&#xff1a;保持不变&#xff08;Retain Original&#xff09;3.2 Type …...