Protobuf 通信协议实战

使用protobuf作为游戏网络通讯的协议 使用的xml,json不是挺好的吗?为什么要用这个东西? 首先我们来了解一下protobuf这个东西吧! 要知道Protobuf是google的一个开源项目 那么他能用来干什么呢?1.数据存储(序列化和反序列化),这个功能类似xml和json等;2.制作网络通信协议; 既然是开源项目,那么我们就可以去github上面去下载下来研究。GitHub上面链接地址 为什么要使用protobuf呢? Protobuf 全称Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行 阅读详情

 

简介

      从第一次接触Protobuf到实际使用已经有半年多,刚开始可能被它的名字所唬住,其实就它是一种轻便高效的数据格式,平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域。

 

优点

  • 平台无关,语言无关,可扩展;
  • 提供了友好的动态库,使用简单;
  • 解析速度快,比对应的XML快约20-100倍;
  • 序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。

使用详解

1、服务器安装

安装依赖的库:     autoconf automake libtool curl make g++ unzip

安装:

  1 $ ./autogen.sh
  2 $ ./configure
  3 $ make
  4 $ make check
  5 $ sudo make install

2、 安卓客户端安卓

               下载相应版本jar包即可。(csdn上上传了nano版本的jar包和exe文件)

3、 项目实战

       首先举一个服务端和客户端按照Protobuf协议进行数据数据传输的例子,工作流程如下图:(图下方深色部分为服务端部分,上方浅色部分为客户端部分)

 

PB协议工作流程 (2)

1、服务端和客户端约定他们使用PB协议作为数据传输和存储的工具,并约定传输信息的字段,如下:里面定义支付传输的字段。

复制代码

  1 syntax = "proto2";          // PB协议版本
  2 import "Common.proto";      // 引入Common.proto,位于Protobuf sdk中
  3 
  4 option optimize_for = LITE_RUNTIME;
  5 
  6 option java_package = "com.xxxx.entity.pb";    // 生成类的包名
  7 option java_outer_classname = "PayInfo";       // 生成类的类名
  8 
  9 message PayInfo{
 10 	required string payid = 1;             // 支付相关的字段信息
 11 	optional string goodinfo = 2;          // optional 为可选参数
 12 	required string prepayid = 3;          // required为必填参数
 13 	optional string mode = 4;
 14 	optional int  userid = 5;
 15 	repeated string  extra = 6;           // repeated 为数组
 16 }

复制代码

2、通过Protobuf源码编译得到可运行程序(也可以在网上查找下载,注意PB协议的版本)。得到exe程序中,在windows环境下通过命令行窗口命令生成上述文件中定义的PayInfo.java文件。(protoc 为可执行的exe文件)

  1 protoc --java_out ./ ./PayInfo.proto

3、将生成PayInfo文件集成到项目代码中,同时需要引入 ProtoBuf的sdk(因为生成的PayInfo.Java类中引入了sdk中的类),可以在github上下载:https://github.com/google/protobuf。

4、服务端通过支付信息初始化PayInfo类,并调用ProtoBufSDK中 com.google.protobuf.nano 类的 toByteArray()方法将PayInfo转化为字节数组,通过网络传输给客户端(可以进行加密和压缩操作,注意顺序)。

  1 public static final byte[] toByteArray(MessageNano msg) {
  2         byte[] result = new byte[msg.getSerializedSize()];
  3         toByteArray(msg, result, 0, result.length);
  4         return result;
  5     }

5、客户端拿到字节数据后,通过集成的PayInfo.java文件对字节数据解析成PayInfo对象(通过程序生成的java文件都会自动生成这个函数)。

  1 public static PayInfo parseFrom(byte[] data)

自此:客户端就顺利拿到了服务端发送的支付信息,可以通过他们调起支付宝或者微信客户端发起支付了。

由此可以看出ProtoBuf只是一种协议,一种存储数据的格式,对应上面生成的字节数据的格式,任何语言的程序都可以通过本地类和jar包将字节数据解析成对象(语言/平台无关)。

使用建议:

1、通过编译程序生成.java文件有不同的版本,建议使用nano版本(3.0之后的PB协议才发布该版本),这种版本生成的java文件方法数较少(没有set,get等函数),对APK的体积影响更小(四五个文件大前后相差80~90Kb,项目中后续作了替换)。命令:

  1 protoc_3.1.0.exe  --javanano_out ./ ./GetConfig.proto

2、不管用2.0还是3.0还是nano版本还是非精简版最终生成的字节数据文件是相同的,不影响前后端的交互。

与其它数据协议比较

     Protobuf 有如 XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。Protobuf 语义更清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。

     和其它数据协议的比较如下图:

image

 

为什么Protobuf作为数据传输协议如此高效?

1. 数据小:

  a) 同json相比较,它不需要传递key值,而是用第几个元素成员变量来表示(而且index使用varient来存储,只占用一个字节)。

  b) 它还会开辟一个字节存放 该字符串的长度,用于直接查找字符串。

  c) 不需要传输','/‘:’等不必要的分隔符,存储没有浪费。

  其存储格式如下:

 

2. 解析速度快:

json解析成对象的话,需要将每个成员变量的key值到整个json串中匹配查找key。而在protobuf中直接通过比较tag序列就可以了,而且值的获取也可以直接通过legth获取,所以解析速度非常快。

【鸿蒙实战开发】 OpenHarmony(数据)通信协议、数据存储—protobuf ProtoBuf(protocol buffers) 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。,是一种灵活,高效,自动化机制的结构数据序列化方法比XML更小,更快,更为简单。本项目主要是OpenHarmony系统下以 protobuf.js 5.0.3 为主要依赖开发,主要接口针对OpenHarmony系统进行合理的适配研发。 阅读详情

相关推荐

逆向工程实战:解析短视频App的Protobuf+RC4加密通信协议

在网络通信与数据安全领域,协议分析与数据序列化是基础且关键的技术环节。Protocol Buffers(Protobuf)作为一种高效的二进制序列化协议,因其体积小、解析快的特点,广泛应用于微服务与移动端的数据交换。而RC4作为一种经典的流加密算法,尽管在现代高安全场景中已不推荐,但在一些对性能有要求的通信链路中仍可见其身影。理解其加解密原理,对于进行安全审计、性能优化或第三方服务对接具有重要价值。本次分析聚焦于一个典型场景:某主流短视频App的客户端与服务器通信。通过结合静态逆向与动态Hook技术,完整还

weixin_33834137的博客 369

google protobuf_Protobuf普及篇

Protobuf是什么Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储 为什么要使用Protobuf优点平台无关,语言无关,可扩展;提供了友好的动态库,使用简单;解析速度快,比对应的XML快约20-100倍;序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。服务器安装安装依赖的库: autoconf aut...

weixin_39915721的博客 499

Nanopb实战:在嵌入式系统中高效部署Protobuf通信协议

本文详细介绍了如何在资源受限的嵌入式系统中高效部署和使用Nanopb,这是一个专为嵌入式环境设计的轻量级Protobuf实现。通过实战教程,从协议定义、代码生成到编码解码,展示了如何利用Nanopb解决设备通信中的字节序、对齐和扩展性问题,并分享了内存优化与避坑指南,帮助开发者构建紧凑、跨平台的通信协议。

weixin_29185493的博客 60

protocol buffer协议的两种常用框架protobuf和nanopb

protocol buffer协议的两种常用框架protobuf和nanopb

hsy12342611的专栏 5720

Protobuf vs JSON:分布式RPC框架通信协议选型避坑指南(含性能对比测试)

本文深入对比了Protobuf与JSON在分布式RPC框架中的性能与适用场景。通过详尽的基准测试,量化了Protobuf在序列化速度、数据压缩和降低延迟方面的显著优势,尤其适合高并发微服务通信。同时,文章提供了多协议并存框架的设计方案与选型避坑指南,帮助开发者在性能与开发效率间做出平衡决策。

weixin_29021291的博客 309

抖音Web端私信Protobuf逆向解析实战

本文详细解析了抖音Web端私信通信的逆向过程,发现其核心采用WebSocket传输Protobuf序列化数据。通过抓包获取二进制样本,利用protoc工具进行原始解码,并逐步推导和编写出对应的.proto协议定义文件,最终实现模拟消息的编码与解码,为理解私有协议逆向提供了完整实战案例。

water的专栏 762

Protocol Buffer nano在Mbed OS中的使用

Protocol Buffer 是google 公司开发的结构化数据序列化/反序列化方法。它比json和XML 效率更高。我们在ModularIoT 中使用Protocol buffer 实现消息体的编解码。当然也希望在微处理器cortex-M 的微服务器中也可以使用protobuf的编解码。网络上看见一个Protocol Buffer Nano 的项目。而且在Mbed OS 社区也发现...

姚家湾博客 973

[车联网安全自学篇] Android安全之Protobuf 协议安全「正向反解Protobuf 协议与逆向反解Protobuf 协议讲解」

现在大多数的手机客户端采用http+json或https+json的方式与服务器进行通信,也有采用TCP+Protobuf或TCP+Protobuf+AES(以及其它例如RSA、DES、MD5等算法)实现,前者实现方便各种框架简单的就构建起了网络通信模块,后者的话需要强大的服务器性能,需要一定的技术储备,Protobuf基于二进制减少了传输的内容但不易阅读。...

橙留香Park的博客 746

Protobuf vs JSON:分布式RPC框架通信协议选型实战(含性能对比测试)

本文深入对比了Protobuf与JSON在分布式RPC框架中的通信协议选型。通过详尽的性能测试,揭示了Protobuf在序列化速度、网络体积及端到端延迟上的显著优势,尤其适合高性能内部微服务通信。同时,文章探讨了JSON在调试与生态上的便利性,并提供了构建兼容多协议框架的实战方案,为分布式系统架构决策提供数据支撑。

melon的博客 698

protobuf-javanano-3.0.0-alpha-4.jar

google的一种数据交换的格式,它独立于语言,独立于平台。这个是java nano版本的jar包

USB PD快充功率监测仪:高精度嵌入式USB电压电流测量终端

USB供电已从数据接口演进为关键电源总线,尤其在PD快充场景下,工程师亟需对5V–20V宽压范围内的实时电压、电流及瞬时功率进行精准捕获。其底层原理依赖高共模抑制比的高边电流检测与分压采样+ADC数字化处理,结合LDO低噪声供电保障模拟链路精度。该类设备的技术价值在于以低成本实现协议无关的‘电气层可视化’,规避商用ASIC测试仪的黑盒局限,支撑PD充电验证、电源设计调试与教学实验等工程实践。本文介绍的开源USB表即基于N32G430 MCU与INA199电流检测芯片,覆盖USB-C输入/输出双通道监测,具备

weixin_42174098的博客 210

Android APP通信协议逆向:AES+Base64+Protobuf加密还原实战

在移动IoT应用开发与安全测试中,客户端通信数据加密是常见防护手段,其核心原理多基于对称加密(如AES)配合编码(Base64)与序列化(Protobuf)的分层处理。这类方案不依赖高强度密码学,而重在混淆传输边界,提升初级分析门槛。技术价值在于支撑接口调试、自动化测试、协议兼容性验证及合规性审计;典型应用场景包括智能家居APP(如某智网)的登录鉴权、设备控制指令解析与心跳报文逆向。本文聚焦已获取可调试APK前提下的工程化还原路径,系统覆盖密文定位、Java层入口识别、JNI密钥提取及脚本化解密落地,深度融

weixin_33978578的博客 545

某讯天御滑块验证码逆向实战:从参数解析到环境对抗

本文详细解析了某讯天御滑块验证码的逆向工程实战技巧,从关键参数解析到浏览器环境模拟对抗。重点介绍了collect、eks等参数的逆向思路,以及如何通过puppeteer等工具补全环境检测,帮助开发者有效突破验证码防护。文章还提供了常见错误解决方案和性能优化建议,是验证码逆向领域的实用指南。

weixin_29325007的博客 441

深入解析Kubernetes内部通信:从gRPC到Protobuf的实战指南

gRPC是一种基于HTTP/2协议的远程过程调用(RPC)框架,由Google开源。高性能:使用HTTP/2的多路复用特性,减少网络延迟。强类型:通过Protobuf定义接口和数据结构,避免数据解析错误。跨语言支持:自动生成客户端和服务端代码,支持多种编程语言。在Kubernetes中,etcd与的通信正是基于gRPC,以满足集群元数据高频读写的性能需求。通过.proto理解Kubernetes的通信机制,不仅是掌握集群运维的关键,更是设计高性能分布式系统的基石。

LixxCn的博客 1137

飞腾X100芯片GPU状态查询

本文档对在linux系统下查看X100芯片GPU状态信息进行说明,可以帮助大家了解芯片的实时工作状态。

乌拉大喵喵 2820

基于STM32L4XX、HAL库的DP83822 以太网收发器(PHY)驱动程序设计

一、简介:DP83822是德州仪器(TI)推出的一款低功耗、高性能10/100Mbps以太网物理层收发器(PHY)。它具有以下主要特性:支持10BASE-T和100BASE-TX以太网标准低功耗设计,适合嵌入式应用MII/RMII接口,方便与微控制器连接内置自检和诊断功能支持自动协商和手动配置工业级温度范围(-40°C至+85°C)

zhusl6688的博客 531

ptotobuff

之前在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML,而在最近的开发中接触到了 Google 的 ProtoBuf. 1 什么是Protobuff protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等, Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。 你可以定义数据的结构

nuc_baixu的博客 982

微信小程序 - 解决报错 {“errcode“:41002,“errmsg“:“appid missing, rid: X“} 微信报错错误码errcode“:41002问题分析及解决教程(详细排查)

【微信小程序】报错{“errcode“:41002,“errmsg“:“appid missing, rid: 64e55770-67c1fb7e-027c5a70“}:【微信小程序】微信小程序登录请求出现appid missing提示,微信公众号{"errcode":41002,"errmsg":"appid missing"},微信 报错{“errcode“:41002,“errmsg“:“appid missing,微信小程序获取openid返回appid missing的问题,微信小程序提示Erro

🏆 前端领域优质创作者 5661

[通信协议] gRPC流式实战:智能体来了(西南总部)AI agent指挥官与调度官的高性能交互设计与Protobuf定义

本文将深度复盘 智能体来了(西南总部) 技术团队的内部通信协议设计。我们将展示如何定义 Protobuf 契约,并实现 Go (调度官) 与 Python (指挥官) 之间的 双向流式 (Bidirectional Streaming) 高性能交互。

a1159530428的博客 734

Prompt Engineering 学习指南:从入门到精通的最佳路径与资源

随着大型语言模型(LLM)能力的飞速发展,Prompt Engineering(提示工程)已成为人与AI协作的核心技能。本报告旨在为不同水平的学习者提供一条清晰、高效的学习路径,整合了当前社区公认的最佳实践和顶级开源资源,帮助您系统地掌握 Prompt Engineering,释放 LLM 的全部潜力。保持好奇心,不断尝试,您将能驾驭语言模型这一强大的工具,创造出前所未有的价值。超越简单的“一问一答”,学习如何将 Prompt Engineering 与外部工具和数据结合,构建强大的 AI 应用。

shiter编写程序的艺术 700

YOLOv10改进策略【注意力机制篇】| 2024 蒙特卡罗注意力(MCAttn)模块,提高小目标的关注度

本文记录的是基于蒙特卡罗注意力(MCAttn)模块的YOLOv10目标检测改进方法研究。利用提高的跨尺度特征提取能力,使模型能够更好地传递和融合提取的多尺度特征,提高对小目标的关注度。Exploiting Scale-Variant Attention for Segmenting Small Medical Objects使用一种基于随机采样的池化操作来生成尺度无关的注意力图。它从三个不同尺度(3×33×33×3、2×22×22×2和1×11×11×1,即池化张量)中随机选择一个1×11×11×1注意力图

Limiiiing的博客 2189

嵌入式linux golang,嵌入式linux之go语言开发(七)protobuf的使用-Go语言中文社区

之前写过一篇博文:《如果终端采用protobuf与采集前置通信,能带来哪些变革?https://blog.youkuaiyun.com/yyz_1987/article/details/81147454》,介绍了使用protobuf作为序列化通信格式的诸多好处。那么接下来在嵌入式linux之go语言开发实战中,也尝试用protobuf作为序列化和通信的协议格式。之前想做个protobuf序列化的反向解析工具,...

weixin_39812039的博客 354

RuntimeError: The current installed version of g++ (4.8.5) is less than the mininum version CUDA解决方案

本文主要介绍了RuntimeError: The current installed version of g++ (4.8.5) is less than the mininum version CUDA解决方案,希望能对学习python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

浅浅的 Protobuf通信协议

Protobuf通信协议详解:代码演示、详细原理介绍等

qq_44179528的博客 950

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: HTTP请求协议头部字段-Connection=keepalive
下一篇: 重新discovery coordinator,然后JoinGroup + SyncGroup
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值