首页 > Photon > 进阶系列 > PhotonServer(七)使用Protobuf实现二进制数据传输
2017
11-18

PhotonServer(七)使用Protobuf实现二进制数据传输

这篇文章为进阶内容,之前的数据传输机制已经可以很好的适用于大部分项目了。但为了更快、更清晰的传输,这篇我们来拓展学习一下Protobuf数据的传输

介绍

protobuf是google的一个开源项目,可用于以下两种用途:
(1)数据的存储(序列化和反序列化),类似于xml、json等;
(2)制作网络通信协议。

protobuf比XML、比JSON更为强悍,语言无关、平台无关、更小的存储、更少的歧义、更高的性能

同时为了更方便的保证客户端和服务器端的传输内容一致性,便于以后维护、代码阅读。我们将消息传输内容统一使用类的结构

这里我们来继续第六节内容,将下面内容以类对象形式传输

一、将客户端发送给服务器的该玩家位置信息

二、服务器发给客户端的其它玩家位置信息

分析

我们先回顾一下这两条涉及的代码内容:

第一条是客户端发给服务器,是在我们客户端SyncTransformRequest实现的

这里我们发给服务器三条数据,分别是x\y\z的坐标

第二条是服务器发给客户端,在服务器的SyncPositionThread实现的

这里服务器发给客户端的是一条string类型的事件,但实际是由List<PlayerData>格式转XML生成的string格式,这样看来,其实是List<PlayerData>格式的

PlayerData的内容也是包含x\y\z和username四个字段

创建Proto文件

根据我们分析出的数据格式,我们来创建对应的proto文件

没有了解过proto的可以学习下:Protobuf语言指南

我们打开记事本,创建一个文件,名称:SyncTransform.proto,这个文件下步会用到,但项目里用不到,所以可以先临时保存在桌面

在文件里我们创建SyncPositionC2S和SyncPositionEvtS2C两个类

SyncPositionC2S:客户端发给服务器的位置消息

SyncPositionEvtS2C:服务器发给客户端的位置消息

通过.proto文件生成.cs文件

这个是proto文件格式,通过ProtoGen工具可以将其转成cs格式文件

proto转cs工具:Protobuf-net使用ProtoGen批量转换成cs文件

转换后的cs文件SyncTransform.cs

因为我们要把消息用到的数据类使用DLL库封装起来用,所以这个cs文件项目里也用不到,我们也先保存在桌面

SyncTransform.cs生成DLL库

为了方便客户端和服务器端消息数据类能够统一管理,方便维护,我们将所有消息类生成DLL

这里我们暂时只有SyncTransform数据类,所以就将这一个文件生成DLL

关于生成DLL库,继续这个教程:使用VS将cs文件生成DLL

生成后,我们将该教程里生成的ProtoData.dll文件导入到客户端Unity的Plugins目录和在服务器端添加引用

由于缺少protobuf库的引用,所以会有报错

添加protobuf-net.dll

protobuf-net是谷歌的产品,可以从google下载

1.翻墙从谷歌下载:https://code.google.com/archive/p/protobuf-net/downloads

2.如果不方便翻墙的可以从:https://github.com/654306663/ProtoGenToCs.git

第二个链接在使用proto转cs工具这个教程里面已经给链接了

下载完后打开Full文件夹

1.客户端:将unity/protobuf-net.dll放入Plugins目录

2.服务器端:根据服务器选择的目标框架版本,默认添加net30/protobuf-net.dll引用

当添加完引用后,随便打开客户端和服务器端脚本,测试下我们自己生成的DLL是否生效

PhotonServer(七)使用Protobuf实现二进制数据传输 - 第1张  | u3d8技术分享

添加ProtoBuf消息序列化与反序列化

在客户端和服务器的Tools文件夹里,都添加BinSerializer,作用是

1.将类序列化为二进制流格式进行消息传输

2.接收二进制流,将其反序列化为类类型

BinSerializer

至此我们才完成了准备工作,下面将修改客户端和服务器的位移同步消息内容

客户端修改位移同步消息

SyncTransformRequest 客户端发给服务器端的该客户端玩家的位移同步消息

SyncTransformEvent 客户端接收服务器发来的所有玩家位移同步消息

Player 同步所有所有玩家位置的方法OnSyncPositionEvent

至此,客户端修改内容完成,之前用到的PlayerData数据类已经不需要了。可以把Common目录删掉了~

服务器端修改位移同步消息

SyncTransformHandler 用来接收客户端发来的位移同步消息

SyncPositionThread 用来服务器端每隔指定时间发送给所有客户端的位移同步消息

服务器端的修改也完成了,同样PlayerData数据类已经不需要了,Common目录可以直接删除掉

 

结束

这个系列课程已经完成,希望对大家有帮助~~

Unity使用版本:Unity5.3.4

ProtoServer使用版本:4.0.28.2962

MySQL使用版本:5.7

GitHub下载地址:

https://github.com/654306663/PhotonServer

最后编辑:
作者:网虫虫
网虫虫
分享是一种快乐; 分享是一种美德; 分享是一种幸福!

留下一个回复

你的email不会被公开。