某项目实战分析代码二
某项目实战分析代码二
- 此次分析的是protobuf的使用
- 操作流程
- 具体实现
- 3. 业务数据分析
- 3.1 客户端
- 3.2 服务器端
- 简单案例
此次分析的是protobuf的使用
Protocol Buffer( 简称 Protobuf) 是Google公司内部的混合语言数据标准,它是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或RPC 数据交换格式。
Protobuf是一个纯粹的展示层协议,可以和各种传输层协议一起使用,Protobuf的文档也非常完善。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。
Protobuf支持的数据类型相对较少,不支持常量类型。由于其设计的理念是纯粹的展现层协议,目前并没有一个专门支持Protobuf的RPC框架。
更多资料可查看:https://developers.google.com/protocol-buffers/
操作流程
- 准备数据
- 复合类型: 结构体/ 类
- 基础类型
- 创建一个新文件
xxx.proto- 将我们要序列化的数据 -> 写入到proto文件
- 有语法格式
- 通过一个命令
protoc将xxx.proto文件生成一个c++的类
- 对应一个头文件/ 源文件
- 操作命令-> 在window终端中:
protoc xxx.proto --cpp_out=./- 直接使用这个类
- 里边有对数据操作的api
- 读数据 api
- 方法名字
变量名()- 写数据 api
- 方法名字:
set_变量名(arg)
具体实现
// 要序列化的数据
struct Persion
{int id;string name;string sex; // man womanint age;
};
在.proto文件中定义消息格式
// protobuf的版本
syntax = "proto3"; // proto2
// 组织Persion结构体
// 语法格式
message 关键字(相当于被创建出的类的名字)
{// 成员变量数据类型 变量名 = 变量的编号; // 编号从1开始, 不能重复
}// .proto文件 生成 c++ 类的命令
protoc proto文件名 --cpp_out=生成目录
| .proto类型 | **C++**类型 | 备注 |
|---|---|---|
| double | double | 64位浮点数 |
| float | float | 32位浮点数 |
| int32 | int32 | 32位整数 |
| int64 | int64 | 64位整数 |
| uint32 | uint32 | 32位无符号整数 |
| uint64 | uint64 | 64位无符号整数 |
| sint32 | sint32 | 32位整数,处理负数效率比int32更高 |
| sint64 | sint64 | 64位整数,处理负数效率比int64更高 |
| fixed32 | uint32 | 总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。 |
| fixed64 | uint64 | 总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。 |
| sfixed32 | int32 | 总是4个字节 |
| sfixed64 | int64 | 总是8个字节 |
| bool | bool | 布尔类型 |
| string | string | 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本 |
| bytes | string | 处理多字节的语言字符、如中文 |
| enum | enum | 枚举 |
| message | object of class | 自定义的消息类型 |
-
repeated限定修饰符
syntax = "proto3"; message Persion {int32 id = 1; // 编号从1开始bytes name = 2;string sex = 3;int32 age = 4; } // 要求name有多个 -> 数组 syntax = "proto3"; message Persion {int32 id = 1; // 编号从1开始// vector<string> name;repeated bytes name = 2; // name可以在程序中创建多个, 在程序中作为动态数组来使用string sex = 3;int32 age = 4; } -
枚举
syntax = "proto3"; // 定义枚举 enum Color {Red = 0; // protbuf中第一个枚举值必须为0Green = 6;Blue = 9; } message Persion {int32 id = 1; // 编号从1开始bytes name = 2;string sex = 3;int32 age = 4;Color color = 5; // 枚举变量 } -
proto文件的导入
// Persion.proto syntax = "proto3"; // 导入另外一个proto文件 import "Info.proto";enum Color {Red = 0; // protbuf中第一个枚举值必须为0Green = 6;Blue = 9; }message Persion {int32 id = 1; // 编号从1开始repeated bytes name = 2;string sex = 3;int32 age = 4;Color color = 5;Info info = 6; // Info对象, 导入的proto文件中的类 }// Info.proto syntax = "proto3";message Info {bytes address = 1; // 地址int32 number = 2; // 门牌号 } -
包 -> 命名空间
// Persion.proto syntax = "proto3"; // 导入另外一个proto文件 import "Info.proto"; // 添加命名空间 package itcast; // Persion类属于itcast这个命名空间enum Color {Red = 0; // protbuf中第一个枚举值必须为0Green = 6;Blue = 9; }message Persion {int32 id = 1; // 编号从1开始repeated bytes name = 2;string sex = 3;int32 age = 4;Color color = 5;// 命名空间.类名itheima.Info info = 6; // Info对象, 导入的proto文件中的类 }// Info.proto syntax = "proto3"; // Persion类属于itheima这个命名空间 package itheima;message Persion {bytes address = 1; // 地址int32 number = 2; // 门牌号 } -
使用protobuf编译器生成C++类
# protobuf编译器, 编译源码得到的 protoc.exe # 语法 # --cpp_out 生成的c++类的位置 protoc.exe xxx.proto --cpp_out=目录 -
使用C++ API来读写消息
3. 业务数据分析
3.1 客户端
// 准备要发送的数据
struct RequestMsg
{//1 密钥协商 //2 密钥校验; // 3 密钥注销int cmdType; // 报文类型string clientId; // 客户端编号string serverId; // 服务器端编号string sign;string data;
};
message RequestMsg
{int32 cmdType;bytes clientId;
}
3.2 服务器端
struct RespondMsg
{bool rv; // 返回值int seckeyid; // 对称密钥编号 keysnstring clientId; // 客户端编号string serverId; // 服务器编号string data; // 服务器端随机数
};
简单案例
1.新建protobuf文件
syntax = "proto3";message Persion{int32 id = 1; // 编号从1开始bytes name = 2;string sex = 3;int32 age = 4;}
2.按住shift+左键,进入powerShell,执行命令生成文件

相关文章:
某项目实战分析代码二
某项目实战分析代码二 此次分析的是protobuf的使用操作流程具体实现 3. 业务数据分析3.1 客户端3.2 服务器端简单案例 此次分析的是protobuf的使用 Protocol Buffer( 简称 Protobuf) 是Google公司内部的混合语言数据标准,它是一种轻便高效的结构化数据存储格式&…...
全面指南:探索并实施解决Windows系统中“mfc140u.dll丢失”的解决方法
当你的电脑出现mfc140u.dll丢失的问题是什么情况呢?mfc140u.dll文件依赖了什么?mfc140u.dll丢失会导致电脑出现什么情况?今天这篇文章就和大家聊聊mfc140u.dll丢失的解决办法。希望能够有效的帮助你解决这问题。 哪些程序依赖mfc140u.dll文件…...
QT学习笔记1(QT和QT creator介绍)
QT学习笔记1(QT和QT creator介绍) Qt 是一个跨平台的应用开发框架,主要用于图形用户界面(GUI)应用的开发,但也支持非GUI程序的开发。Qt 支持多种平台,如Windows、macOS、Linux、iOS和Android&a…...
存储电话号码的数据类型,用 int 还是用 string?
在 Java 编程中,存储电话号码的选择可以通过两种常见方式进行:使用 int 类型或 String 类型。这种选择看似简单,但实际上涉及到 JVM 内部的字节码实现、内存优化、数据表示、以及潜在的可扩展性问题。 Java 基本数据类型与引用数据类型的差异…...
【目标检测】工程机械车辆数据集2690张4类VOC+YOLO格式
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2694 标注数量(xml文件个数):2694 标注数量(txt文件个数):2694 标注…...
target_link_libraries()
target_link_libraries() 是 CMake 中的一个命令,用于指定目标(如可执行文件或库)所依赖的其他库。其主要作用包括: 链接库:将指定的库链接到目标上,使目标能够调用这些库中的函数和使用其功能。 管理依赖…...
Javascript数组研究09_Array.prototype[Symbol.unscopables]
Symbol.unscopables 是 JavaScript 中一个相对较新的符号(Symbol),用于控制对象属性在 with 语句中的可见性。它主要用于内置对象,如 Array.prototype,以防止某些方法被引入到 with 语句的作用域中,避免潜在…...
SkyWalking 自定义链路追踪
对项目中的业务方法,实现链路追踪,方便我们排查问题 引入依赖 <!‐‐ SkyWalking 工具类 ‐‐> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm‐toolkit‐trace</artifactId> <vers…...
Linux驱动开发(速记版)--设备模型
第八十章 设备模型基本框架-kobject 和 kset 80.1 什么是设备模型 设备模型使Linux内核处理复杂设备更高效。 字符设备驱动适用于简单设备,但对于电源管理和热插拔,不够灵活。 设备模型允许开发人员以高级方式描述硬件及关系,提供API处理设备…...
动手学深度学习(李沐)PyTorch 第 6 章 卷积神经网络
李宏毅-卷积神经网络CNN 如果使用全连接层:第一层的weight就有3*10^7个 观察 1:检测模式不需要整张图像 很多重要的pattern只要看小范围即可 简化1:感受野 根据观察1 可以做第1个简化,卷积神经网络会设定一个区域,…...
新编英语语法教程
新编英语语法教程 1. 新编英语语法教程 (第 6 版) 学生用书1.1. 目录1.2. 电子课件 References A New English Grammar Coursebook 新编英语语法教程 (第 6 版) 学生用书新编英语语法教程 (第 6 版) 教师用书 1. 新编英语语法教程 (第 6 版) 学生用书 https://erp.sflep.cn/…...
Golang 服务器虚拟化应用案例
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
Elasticsearch基础_4.ES搜索功能
文章目录 一、搜索辅助功能1.1、指定返回的字段1.2、结果计数1.3、结果分页 二、搜索匹配功能2.1、查询所有文档2.2、term级别查询2.2.1、term查询2.2.2、terms查询2.2.3、range查询2.2.4、exists查询 2.3、布尔查询2.3.1、must,should,must_not2.3.2、f…...
Elasticsearch要点简记
Elasticsearch要点简记 1、ES概述2、基础概念(1)索引、文档、字段(2)映射(3)DSL 3、架构原理4、索引字段的数据类型5、ES的三种分页方式(1)深度分页(fromsize)…...
【通信协议】IIC通信协议详解
IIC(Inter-Integrated Circuit)通信协议,又称为I2C(Inter-Integrated Circuit 2)协议,是一种广泛使用的串行通信协议。它由Philips Semiconductor(现NXP Semiconductors)开发&#x…...
2024年中国科技核心期刊目录(社会科学卷)
2024年中国科技核心期刊目录 (社会科学卷) 序号 期刊代码 期刊名称 1 SC02 JOURNAL OF S…...
用Python集成免费IP归属地查询API
IP查询的优势是什么? IP查询是一种强大的工具,能够快速提供关于IP地址的信息,如地理位置、互联网服务提供商(ISP)、连接类型等。这些数据在多种场景下都非常有用,帮助用户理解网络环境和用户行为。 首先&…...
C 数组
C 数组 数组是C语言中的一种基本数据结构,用于存储一系列相同类型的数据。它是连续的内存分配,允许通过索引快速访问元素。本文将详细介绍C数组的概念、使用方法、以及注意事项。 1. 数组的概念 数组是一个集合,可以存储一定数量的元素。在…...
【Unity】unity安卓打包参数(个人复习向/有不足之处欢迎指出/侵删)
1.Texture Compression 纹理压缩 设置发布后的纹理压缩格式 Use Player Settings:使用在播放器设置中设置的纹理压缩格式 ETC:使用ETC格式(兼容) ETC2:使用ETC2格式(很多设备不支持) ASTC:使用…...
C0016.Clion中qDebug()打印输出中文时,都是问号??????的解决办法
问题描述 在clion中使用qDebug打印输出中文内容时,都是?????如下图: 注意:修改该文件的编码格式就行,该文件名为apr.cpp; 解决办法...
FactoryIO虚拟仓储避坑指南:从入仓出仓到急停处理的完整调试流程
FactoryIO虚拟仓储避坑实战:从坐标校准到多任务管理的深度调试手册 当第一次在FactoryIO中搭建虚拟仓储系统时,我盯着屏幕上那个69的货架模型,满心以为两小时就能搞定入仓出仓逻辑。直到凌晨三点,我还在和那个永远差0.006的坐标值…...
2025最新版PHP加密系统MENC加密系统 V2.4.0 含搭建教程
内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 很牛逼的一款加密系统,PHP代码加密系统是一个值得信赖的工具,它可以帮助开发者保护自己的代码不受恶意攻击和盗用。无论是个人开发者还是企业用户,都可…...
Perplexity国际新闻搜索深度解析(全球记者都在用的AI情报工作流)
更多请点击: https://codechina.net 第一章:Perplexity国际新闻搜索深度解析(全球记者都在用的AI情报工作流) Perplexity 不仅是问答引擎,更是现代调查记者与情报分析师的“实时新闻雷达”。其核心优势在于融合权威信…...
CSDN博客批量下载器重构实战:MVC架构下的智能爬虫解决方案
CSDN博客批量下载器重构实战:MVC架构下的智能爬虫解决方案 【免费下载链接】CSDNBlogDownloader 项目地址: https://gitcode.com/gh_mirrors/cs/CSDNBlogDownloader 在技术博客内容日益成为开发者知识体系核心的时代,网络内容的不稳定性与知识管…...
【免费下载】 探索地理信息的无限可能:MATLAB Mapping Toolbox 自由之旅【matlab下载】
探索地理信息的无限可能:MATLAB Mapping Toolbox 自由之旅 在数字化时代的浪潮中,地理信息系统(GIS)已成为连接现实世界与数字世界的桥梁。今天,我们特别向您推荐一个开源宝藏——MATLAB Mapping Toolbox R2019b提取版…...
可持续交通,正在重写“产品生命周期”
作者:王聪彬一边是全球经济对物流、出行和流动效率的持续依赖,一边则是交通运输正在成为全球减碳进程中最难啃的“硬骨头”。过去几十年,交通系统不断推动全球化与城市化加速,但与此同时,它也成为温室气体排放增长最快…...
别再傻傻分不清了!给硬件工程师的SI、PI、EMI关系速查手册(附高频PCB设计实例)
硬件工程师实战指南:SI、PI、EMI的三角关系与高频PCB设计避坑 当你第一次面对DDR4布线导致的EMI测试失败时,可能会陷入这样的困惑:明明是信号完整性问题,为什么整改方案却是调整电源层的去耦电容?这种看似跨领域的因果…...
Autoswagger与Intruder生态集成:企业级API安全解决方案的完整指南
Autoswagger与Intruder生态集成:企业级API安全解决方案的完整指南 【免费下载链接】autoswagger Autoswagger by Intruder - detect API auth weaknesses 项目地址: https://gitcode.com/gh_mirrors/au/autoswagger 在当今API驱动的数字世界中,AP…...
保姆级教程:用R包MaAsLin2搞定微生物组与临床数据的关联分析(附完整代码)
微生物组与临床数据关联分析实战:MaAsLin2从入门到精通 在微生物组研究中,揭示菌群变化与宿主表型之间的关联是核心科学问题之一。传统统计方法往往难以应对高维稀疏的微生物组数据特性,而专门设计的工具如MaAsLin2(Microbiome Mu…...
告别卡顿!用WebRTC-Streamer在浏览器里丝滑播放海康/大华监控(附完整代码)
告别卡顿!用WebRTC-Streamer在浏览器里丝滑播放海康/大华监控(附完整代码) 监控视频的实时查看一直是许多开发者和运维人员头疼的问题。传统的解决方案如Flash早已被淘汰,而基于FLV.js的方案又常常面临延迟高、卡顿、标签页切换暂…...
