初探远程过程调用RPC(三.protobuf基于Python序列化&反序列化)

1,465 阅读2分钟

本文正在参与 “网络协议必知必会”征文活动

前言

上篇文章对于protobuf做了一个简单的golang语言的序列化,今天再来研究Python语言下protobuf编码的序列化和反序列化,Python和golang一样都是安装依赖包然后使用依赖包的方法直接序列化和反序列化非常简单,但是Python的依赖包需要离线安装较为复杂。

安装Python protobuf库

上篇文章安装系统的protoc软件,用于在win10系统中生成各种计算机语言的protobuf编解码依赖文件,生成过后golang可以根据Git下载依赖,但是Python不行必须再下载里面包来根据系统根据Python版本来进行离线安装。
先去Git下载包: protocolbuffers/protobuf

image.png 下载解压,进入python文件夹 输入命令安装离线包:

python setup.py build
python setup.py test
python setup.py install

image.png 安装完成进行验证,可以看到这个包是以goggle开头的:

import google.protobuf

image.png 没有报错证明安装成功了,非常棒一次成功。

序列化&反序列化

然后进行序列化和反序列化的测试。先定义个ptotobuf规范文件,文件名为test.proto:

syntax = "proto3";
package  test;
message ChatMessage{
  string user = 1;
  string content = 2;
  string backgroundImage = 3;
}

然后输入一下命令生成protobuf编码文件:

protoc ./test.proto --python_out=./

使用protoc生成一个Python可以用的protobuf编解码依赖文件
然后新建一个test.py测试protobuf的序列化和反序列化:

#! /usr/bin/env python
from  test_pb2 import *
from google.protobuf.json_format import MessageToDict

#序列化
message=ChatMessage()
message.user = "土味挖掘机"
message.content = "力给我力Giao"
message.backgroundImage = "https://p9-passport.byteacctimg.com/img/user-avatar/2c7703e223b37e028d27cb904683e015~300x300.image"
saveString = message.SerializeToString() # 序列化
print(saveString)
filename = './encode.txt'
with open(filename, 'wb') as file_object:
    file_object.write(saveString)

f = open(filename, "rb")
message_decode=ChatMessage()
message_decode.ParseFromString(f.read())  # 反序列化
f.close()
print("读取的用户:%s"%message_decode.user)
print("读取的详情:%s"%message_decode.content)
print("读取的图片:%s"%message_decode.backgroundImage)

看看调试结果:

image.png

总结

最近看到大厂的直播的弹幕礼物等消息推送都是Protobuf协议,例如抖音和BiliBili,想到这些大厂可能是为了节约资源吧,每天都有成千上万的人看直播,流量费用肯定很高,很感兴趣所以就稍微研究了一下,也有很多网友进行了抓包做了一些工具,在BiliBili上都还有人做弹幕控制玩游戏的直播,还是挺有意思的。