【ProtoBuf】通讯录实现(网络版)

Protobuf 还常用于通讯协议、服务端数据交换场景。那么在这个示例中,我们将实现一个网络版本的通讯录,模拟实现客户端与服务端的交互,通过 Protobuf 来实现各端之间的协议序列化。

需求如下:

  • 客户端可以选择对通讯录进行以下操作:
  1. 新增⼀个联系人
  2. 删除⼀个联系人
  3. 查询通讯录列表
  4. 查询⼀个联系人的详细信息
  • 服务端提供增、删、查能力,并需要持久化通讯录。
  • 客户端、服务端间的交互数据使用 Protobuf 来完成。


一、环境搭建

Httplib 库:cpp-httplib 是个开源的库,是一个 C++ 封装的 http 库,使用这个库可以在 Linux、Windows 平台下完成 http 客户端、http 服务端的搭建。使用起来非常方便,只需要包含头文件 httplib.h 即可。编译程序时,需要带上 -lpthread 选项。

源码库地址:

yhirose/cpp-httplib: A C++ header-only HTTP/HTTPS server and client library (github.com)


二、Centos 下编写的注意事项

如果使用 CentOS 环境,yum 源带的 g++ 最新版本是 4.8.5,发布于 2015 年,年代久远。编译该项目会出现异常,将 gcc / g++ 升级为更高版本可解决问题。

# 安装scl
yum install -y centos-release-scl# 安装gcc 8版本
yum install -y devtoolset-8-gcc devtoolset-8-gcc-c++# 启⽤版本
source /opt/rh/devtoolset-8/enable# 查看版本已经变成gcc 8.3.1
gcc -v

第二步安装 gcc 8 版本的时候,如果显示如下报错:

Could not retrieve mirrorlist http://mirrorlist.centos.org/

可以参考:

SCL更换阿里数据源_centos-sclo-scl-rh.repo-CSDN博客

注意 scl 命令启用只是临时的,退出 shell 或重启就会恢复原系统 gcc 版本,如果要长期使用的话执行:

echo "source /opt/rh/devtoolset-8/enable" >> /etc/profile

三、约定双端交互接口

1、新增一个联系人

[请求] Post /contacts/add AddContactRequestContent-Type: application/protobuf[响应] AddContactResponse Content-Type: application/protobuf

2、删除一个联系人

[请求] Post /contacts/del DelContactRequest Content-Type: application/protobuf[响应] DelContactResponse Content-Type: application/protobuf

3、查询通讯录列表

[请求]GET /contacts/find-all [响应] FindAllContactsResponse Content-Type: application/protobuf

4、查询一个联系人的详细信息

[请求] Post /contacts/find-one FindOneContactRequest Content-Type: application/protobuf[响应]FindOneContactResponse Content-Type: application/protobuf

四、客户端代码实现

1、add_contact.proto


2、main.cc


3、ContactException.h(定义异常类)


4、makefile


5、运行结果


五、服务端代码实现

1、add_contact.proto(服务端存储通讯录结构定义)


2、main.cc


3、makefile


4、运行结果


六、总

1、序列化能力对比验证

分别使用 PB 与 JSON 的序列化与反序列化能力, 对值完全相同的一份结构化数据进行不同次数的性能测试。为了可读性,下面这一份文本使用 JSON 格式展示了需要被进行测试的结构化数据内容:

{"age" : 20,"name" : "张珊","phone" : [{"number" : "110112119","type" : 0},{"number" : "110112119","type" : 0},{"number" : "110112119","type" : 0},{"number" : "110112119","type" : 0},{"number" : "110112119","type" : 0}],"qq" : "95991122","address" : {"home_address" : "陕西省西安市⻓安区","unit_address" : "陕西省西安市雁塔区"},"remark" : {"key1" : "value1","key2" : "value2","key3" : "value3","key4" : "value4","key5" : "value5"}
}

开始进行测试代码编写,我们在新的目录下新建 contacts.proto 文件,内容如下:

使用 protoc 命令编译文件后,新建性能测试文件 compare.cc,我们分别对相同的结构化数据进行 100、100010000100000 次的序列化与反序列化,分别获取其耗时与序列化后的大小。内容如下:

Makefile:

测试结果如下:

由实验结果可得:

  • 编解码性能:ProtoBuf 的编码解码性能,比 JSON 高出 2-4 倍。
  • 内存占用:ProtoBuf 的内存 278,而 JSON 到达 567,ProtoBuf 的内存占用只有 JSON 的 1/2。

注意:以上结论的数据只是根据该项实验得出。因为受不同的字段类型、字段个数等影响,测出的数据会有所差异。

该实验有很多可待优化的地方。但其实这种粗略的测试,也能从其中看出 ProtoBuf 的优势。


2、总结

  • XML、JSON、ProtoBuf 都具有数据结构化和数据序列化的能力。
  • XML、JSON 更注重数据结构化,关注可读性和语义表达能力。ProtoBuf 更注重数据序列化,关注效率、空间、速度,可读性差,语义表达能力不足,为保证极致的效率,会舍弃⼀部分元信息。
  • ProtoBuf 的应用场景更为明确,XML、JSON 的应用场景更为丰富。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据库 DISQL连接数据库与执行SQL、脚本的方法

DISQL连接数据库与执行SQL、脚本的方法 1.DISQL介绍2.DISQL连接数据库的方法2.1 本地连接2.2 远程连接2.3 CONN连接 3.执行SQL、脚本的方法3.1 通过DISQL登录后在字符界面3.2 启动DISQL时运行脚本3.3 进入DISQL后,通过start命令运行脚本3.4 使用EDIT命令编辑脚本 1.…

PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表

PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表 一、数据库表空间和数据库之间的关系二、索引表空间和数据库之间的关系三、创建角色四、创建表空间目录五、创建表空…

23年阿里淘天笔试题 | 卡码网模拟

第一题 字典序最小的 01 字符串 解题思路: 模拟,统计遇到的连续的1的个数记为num,直到遇到0,如果k>num,直接将第一个1置为0,将遇到的0置为1,否则将第一个1偏置num-k个位置置为0&#xff0…

【中项】系统集成项目管理工程师-第3章 信息技术服务-3.1内涵与外延与3.2原理与组成

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

OV7670寄存器读出0x00或0xFF

文章目录 问题描述原因分析解决方案 问题描述 OV7670的输出图像异常,怀疑寄存器没有正确配置,在SignalTap中观察到SIO_D在读出阶段一直为高或低 寄存器读出0x00 寄存器读出0xFF 原因分析 在确保电源、时钟和读写时序没有问题的情况下,有…

PCB系统学习(1)--PCB印制电路板

PCB印制电路板 1.1PCB的定义1.2PCB的层叠结构1.2.1PCB单层板1.2.2PCB双层板1.2.3PCB四层板 1.3PCB的通孔,盲孔,埋孔1.4元器件的符号与封装1.5PCB的生产过程 1.1PCB的定义 PCB(PrintedCircuitBoard),中文即印制电路板,或印刷线路板…

Linux--多线程

今日内容 线程的结束机制: 1.不同与进程没有孤儿线程和僵尸线程。 2.主进程结束,任意生成的次线程都会结束。(因为共享的进程空间被回收了)。 3.次线程的正常结束不会影响主线程的运行。 子线程的回收策略&a…

分布式ID是什么?有哪些解决方案?

在开发中,我们通常会需要一个唯一ID来标识数据,如果是单体架构我们可以通过数据库的主键,或直接在内存中维护一个自增数字来作为ID都是可以的,但对于一个分布式系统,就会有可能会出现ID冲突,此时有以下解决…

vue3大事件管理系统 === 首页 layout 文章分类页面 -

目录 首页 layout 架子 [element-plus 菜单] 基本架子拆解 登录访问拦截 用户基本信息获取&渲染 退出功能 [element-plus 确认框] 文章分类页面 - [element-plus 表格] 基本架子 - PageContainer 文章分类渲染 封装API - 请求获取表格数据 el-table 表格动态渲染 …

CDM大全

CMD(Command Prompt)是Windows操作系统中的命令行解释器,它允许用户通过键入命令来执行各种操作。以下是一些常用的CMD命令及其功能说明: 文件和目录管理 dir:显示当前目录中的文件和子目录列表。cd:更改…

《0基础》学习Python——第十八讲__爬虫\<1>

一、什么是爬虫 爬虫是一种网络数据抓取的技术。通过编写程序(通常使用Python),爬虫可以自动化地访问网页,解析网页内容并提取出所需的数据。爬虫可以用于各种用途,如搜索引擎的索引,数据分析和挖掘&#x…

NVIDIA 完全过渡到开源 GPU 内核模块

目录 支持的 GPU安装程序更改将包管理器与 CUDA 元包配合使用使用 runfile使用安装帮助程序脚本包管理器详细信息apt:基于 Ubuntu 和 Debian 的发行版dnf:Red Hat Enterprise Linux、Fedora、Kylin、Amazon Linux 或 Rocky Linuxzypper:SUSE …

怎么关闭 Windows 安全中心,手动关闭 Windows Defender 教程

Windows 安全中心(也称为 Windows Defender Security Center)是微软 Windows 操作系统内置的安全管理工具,用于监控和控制病毒防护、防火墙、应用和浏览器保护等安全功能。然而,在某些情况下,用户可能需要关闭 Windows…

光电传感器的详细介绍,包括其原理、结构、分类、应用以及技术发展趋势

光电传感器是一种利用光电转换原理,将光信号转换为电信号的传感器。它在工业自动化、物流、医疗、安全等领域有着广泛的应用,是实现各种检测、测量和控制功能的重要元件。以下是对光电传感器的详细介绍,包括其原理、结构、分类、应用以及技术…

【分布式事务】怎么解决分布式场景下数据一致性问题

分布式事务的由来 拿充值订单举个栗子吧,假设:原本订单模块和账户模块是放在一起的,现在需要做服务拆分,拆分成订单服务,账户余额服务。原本收到充值回调后,可以将修改订单状态和扣减余额放在一个mysql事务…

C语言 | Leetcode C语言题解之第236题二叉树的最近公共祖先

题目: 题解: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/typedef struct road_t {struct TreeNode *road_node; // 途径路径struct road_t *p_next; }…

IPD与CBB研发技术管理体系培训

获取下载完整PPT见下图 更多有关华为研发管理/IPD、MBSE、PLM、ERP、MES、数据治理、数字样机等方面免费解决方案、资料获取,请见下图

python—爬虫的初步了解

Python 爬虫(Web Scraping)是一种自动化从网站上提取数据的技术。Python 由于其简洁的语法、丰富的库和强大的社区支持,成为了实现网络爬虫的首选语言之一。下面是一些Python爬虫的基本概念和步骤: 1. 爬虫的基本概念 请求&…

深入理解Java线程的状态

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

8月长沙学术会议:经济金融发展国际会议(ICEFD 2024)

经济金融发展国际会议(ICEFD 2024)将于2024年8月20-22日在长沙盛大举行。本次会议汇聚了国内外众多高校、科研机构、企业界及其他相关领域的专家学者,共同探讨经济金融发展的新趋势、新挑战和新机遇。 长沙,这座历史悠久的文化名…