首页 > 其他分享 >【ProtoBuf】通讯录实现(网络版)

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

时间:2024-07-20 16:00:07浏览次数:12  
标签:gcc ProtoBuf 网络版 JSON 通讯录 序列化 服务端

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 AddContactRequest
    Content-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、1000、10000、100000 次的序列化与反序列化,分别获取其耗时与序列化后的大小。内容如下:

Makefile:

测试结果如下:

由实验结果可得:

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

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

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


2、总结

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

标签:gcc,ProtoBuf,网络版,JSON,通讯录,序列化,服务端
From: https://blog.csdn.net/weixin_74531333/article/details/140525400

相关文章

  • 【C语言】实现一个通讯录,一步一步详细讲解,小白也能看!!!
    目录设计思路代码实现 代码仓库 设计思路1.通讯录存放的信息这个通讯录保存的信息包括:名字,年龄,性别,电话,住址。2.通讯录的功能1.通讯录可以存放100个人的信息。2.增加联系人3.删除联系人4.修改联系人5.查询联系人6.显示所有人3.文件规划我们准......
  • Protobuf详解与使用
    目录一、Protobuf序列化概述二、Protobuf的原理三、protobuf的安装四、定义message五、编译message文件六、应用Protobuf七、Message的使用1、Message的基本用法2、Message的嵌套使用一、Protobuf序列化概述protobuf是一种比json和xml等序列化工具更加轻量和高......
  • 【c语言】日日练-通讯录
    通讯录题目解析(实现过程+要点)代码test.c(测试功能)contact.c(通讯录相关的实现)contact.h(通讯录相关的声明)题目实现一个通讯录,人的信息包括(姓名、年龄、性别、电话、地址)实现功能:1、存放100个人的信息2、增加联系人3、删除指定联系人4、查找联系人5、修改联系......
  • 项目:通讯录
    通讯录需求分析创建联系人-insert删除联系人-delete搜索联系人-search输出所有联系人-traversal保存文件-save-存储方式key:value的实现加载文件-load-将键值对读入并加入到存储结构中架构分析 实现分析底层实现采用链表实现,因此要定义通讯录结构体,并......
  • Python实现基于http通信的protobuf数据传输的案例,包括请求者和接收者
    个人名片......
  • Protobuf传输协议解析与应用
    个人名片......
  • protobuf简介
    文章目录1.Protobuf是什么2.Protobuf使⽤流程介绍3.ProtoBuf快速上手3.1创建.proto⽂件3.2添加注释3.3具体编写3.4编译contacts.proto文件1.Protobuf是什么  ProtoBuf(全称ProtocolBuffer)是数据结构序列化和反序列化框架,它具有以下特点:语⾔⽆关、平......
  • protobuf-net.Grpc 笔记
    众所周知,Grpc很好用,但每次都需要手动编写*.proto文件,protobuf-net.Grpc个人感觉最大的优势是不用写*.proto文件,相关教程如下:https://learn.microsoft.com/zh-cn/aspnet/core/grpc/code-first?view=aspnetcore-8.0https://protobuf-net.github.io/protobuf-net.Grpc/gettingst......
  • 【C++】通讯录管理系统+少量数据结构
    #include<iostream>#include<string>usingnamespacestd;#definemax1000structnewp{ stringname; intsex; intage; stringnumber; stringadd;};structbooks{ structnewpa[max]; intsize;};staticvoidshowMenu(){ cou......
  • c++ protobuf安装记录
    googleprotobuf是一个灵活的、高效的用于序列化数据的协议。相比较XML和JSON格式,protobuf更小、更快、更便捷。googleprotobuf是跨语言的,并且自带了一个编译器(protoc),只需要用它进行编译,可以编译成Java、python、C++、C#、Go等代码,然后就可以直接使用,不需要再写其他代码,自带有......