使用的xml,json不是挺好的吗?为什么要用这个东西?
首先我们来了解一下protobuf这个东西吧!

要知道Protobuf是google的一个开源项目
那么他能用来干什么呢?
1.数据存储(序列化和反序列化),这个功能类似xml和json等;
2.制作网络通信协议;
既然是开源项目,那么我们就可以去github上面去下载下来研究。
GitHub上面链接地址

为什么要使用protobuf呢?
Protobuf 全称Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python、C#等多种语言的 API。Protobuf是google开源的序列化和反序列化工具,主要是用在网络游戏的消息结构体定义上。它相对于XML文件和Json文件性能更好,效率更高。所以我们使用protubuf啦!

protobuf的基本语言格式了。里面有一些关键字

message People
 {  
        required string name = 1;  
        required int32 id = 2;  
        optional string email = 3;

enum Sex
       {
            MAN = 0;
            WOMAN = 1;
       }

message QQNumber

{
           required string number = 1;
           optional Sex sex = 2 [default = MAN];
      }

repeated QQNumber qq = 4;

}

定义声明:
required:声明该字段是必填字段。对应类的属性
optional:声明该字段是可选字段。创建一个具有默认值的属性,通过[default=XXX]设置默认值,不添加默认为空置。如string默认为“”,int默认为0
repeated:声明该字段是可重复字段,通常用数组表示,也可以是c#语言中的list集合。
enum 创建枚举
message 创建自定义类或内部类

一般游戏主要使用protobuf来作为网络通讯的协议来传输的,下面我们来讨论一下如何设计这个通讯协议呢?

首先我们要有两个必要的数据:协议号协议类型,将这两个数据分别存储起来

当客户端向服务器发送数据时,会根据协议类型加上协议号,然后使用protobuf序列化之后再发送给服务器;
当服务器发送数据给客户端时,根据协议号,用protobuf根据协议类型反序列化数据,并调用相应回调方法。

协议号的作用就是用来确定用于解析数据的解析类,所以也可以称为协议类型名,可以是string和int类型的数据。

首选我们来定制协议类型

客户端会用到的协议类: Client.proto

//发送登录请求类
message CSLoginReq
{required CSLoginInfo LoginInfo = 1;
}

服务端返回用到的协议类:Server.proto

//服务器返回的登录请求回包数据
message CSLoginRes
{required uint32 result_code = 1;
}

前后端都会用到的协议类:Common.proto

 //登陆信息类
message CSLoginInfo
{required string UserName = 1;//账号required string Password = 2;//密码
}

然后来定制协议号, 一般放在 Common.proto

//枚举协议号
enum EnmCmdID
{CS_LOGIN_REQ = 10001;//客户端登陆请求协议号CS_LOGIN_RES = 10002;//服务器返回的登陆请求的回包协议号
}

以上就是前后端共同定制的消息结构,然后会使用protobuf序列化工具,把protobuf转换成c#类脚本供unity使用。

使用protobuf中的protoc.exe和protogen.exe这三个protobuf脚本转换成C#类
一般公司都会有专门的工具会批处理这些pb文件的。
然后将生成的.cs代码放到我们的unity工程中。
下面就可以在客户端直接使用这三个类发送消息了

using UnityEngine;
using System.Collections;
using System;
using ProtoBuf;
using System.IO;public class TestProtobuf : MonoBehaviour {void Start () {//构建登陆类CSLoginInfo mLoginInfo = new CSLoginInfo();mLoginInfo.UserName = "LYZY";mLoginInfo.Password = "666666";CSLoginReq mReq = new CSLoginReq();mReq.LoginInfo = mLoginInfo;//下面就是利用通信类的打包方法将这个发送到服务器端就行了//我们公司直接这样就好了,这里NetworkManager是自己设计封装的一个负责处理网络连接的单例类NetworkManager.Instance.SendToGameServer(mReq);//不同的项目发送网络数据的方法不同,一般都是底层构建好的socket TCP/UDP网络通信协议管道//......}}

这样就可以把我们的登陆信息发送到服务器了。

当我们发送消息过去之后,服务器那边会根据消息号来判断,然后给客户端对应的数据处理。这主要是后端做的事情啦!

下面是服务端返回消息后客户端进行监听处理:

    //注册监听反信MessagePublisher.Instance.Subscribe<LoginReply>(OnReplyLogin);//接收到服务器反信后的处理,这里以一个登录成功就领取奖励为例public void OnReplyLogin(LoginReply reply){if (reply != null){OnLoginRewardReply(reply.claimReward);}}private void OnLoginRewardReply(CliamRewardReply rewardsReply){if (rewardsReply.result == Common.RESULT.RESULT_SUCCESS){LoadClaimReward(rewardsReply);}else{Debug.Log("领取奖励失败");}}

其实说白了,probuf’用于前后端通信的时候就是通过规定的语法内容来进行二进制的一些数据处理,这样比利用json和xml传输效率要高一点,但是公司中既然使用了protobuf这种数据交换格式,肯定会有一套成熟的机制来处理这些文件的,但是一定要明白如何定制消息,发送消息,然后服务器会给我们的是什么样子的内容,搞清楚了这些东西后,管他用什么来传输呢。

使用protobuf作为游戏网络通讯的协议相关推荐

  1. Socket网络通讯_TCP协议

    Socket网络通讯即如上图所示 图中IP代表服务器地址,那么端口是什么呢?

  2. 在网络通讯中应用Protobuf

    Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强:还有一个比较大的优点就是有着很多的语言平台支持.下面讲解一下如何 ...

  3. 用C#实现基于TCP协议的网络通讯(1)

    2008-09-09 19:35 作者: 出处:www.4oa.com ( 11 ) 砖   ( 12 ) 好  评论 ( 0 ) 条 进入论坛 更新时间:2005-09-29 14:54 关 键 词 ...

  4. 游戏开发中网络通讯协议对比

    在网络游戏开发中,通讯协议是一个无法被避免的问题,无论对于客户端开发中还是服务器开发程序猿而言,制定一个合适的通讯协议是很有必要的 游戏联网需求有弱联网游戏,即时互动类游戏 选择通讯协议的时候主要关注 ...

  5. 如何通过序列化在网络间传递对象,网络协议:轻松定义自己的网络通讯协议

    //每次编写设计网络通讯程序时,总面对一个问题,就是要自定义一组应用协议(即通讯协议),然后再写相应的方法来解析协议,并提供相应的接口供上层调用.假如只是简单的文本信息通讯还轻易,但要交换一些控制信息 ...

  6. 企业即时通讯软件,网络通讯协议和机制怎么选?

    一个大型组织如果需要从头开发一套自主可控的即时通讯软件,从技术角度第一个要考虑的核心问题就是:如何确定客户端和服务器之间的通讯协议和通讯机制? 通讯协议怎么选? 大型组织架构就意味着员工人数多,网络情 ...

  7. 用C#实现基于TCP协议的网络通讯

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...

  8. 网络编程2_网络通讯协议, socket(tcp, udp)

    一. 网络通讯协议     互联网协议的功能: 定义计算机如何接入internet, 以及接入internet的计算机的通信标准     互联网协议按照功能的不同分为osi七层或tcp/ip五层    ...

  9. 在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)

    原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议) 原文:  http://www.csdn.net/develop/read_article.as ...

最新文章

  1. js new 运算符到底做了什么?
  2. 参与开源项目,结识技术大牛!CSDN “开源加速器计划”招募志愿者啦!
  3. 深度学习目标检测(object detection)系列(一) R-CNN
  4. golang 去除 空白字符 含制表符
  5. python实现简单的api接口-用python写一个restful API
  6. 每个Java开发人员都应该阅读的10本书
  7. java和c++的区别大吗_小自考本科含金量高吗?小自考和大自考有什么区别?
  8. (转)C#中的委托(Delegate)和事件(Event)
  9. mini_Xception架构
  10. Linux基础管理——磁盘管理及文件系统(全)
  11. 网络电话坐享iOS10红利 iphone7免费通话
  12. 九宫幻方(蓝桥)深搜
  13. 应急指挥中心整体建设方案(ppt)
  14. chromium 47 Chrome浏览器启动命令行参数
  15. python eml解析_使用 python eml-parser 对 eml文件进行格式化
  16. python实现抢票github_抢票神器成GitHub热榜第一,支持候补抢票,Python跑起来
  17. Microsoft OLE DB Provider for SQL Server 错误 ‘80004005‘错误原因和解决方案
  18. Antd给表格一个斜线分隔(通过css改变)
  19. 【imessage苹果推群发】软件安装,通过苹果的TestFlight筹划分派
  20. 微信小程序wepy框架快速入门

热门文章

  1. 炸金花游戏(4)--炸金花AI基准测试评估
  2. Linux_操作系统-基础操作-教学
  3. 论文阅读”NCAGC: A Neighborhood Contrast Framework forAttributed Graph Clustering“(arxiv)
  4. 正点原子Alpha Linux开发板相关资料分享
  5. 知乎上神回复,看完神清气爽
  6. radis--简介和常遇问题
  7. 关于vuze(毒蛙)linux版本移植的问题
  8. @Transactional失效情况
  9. java volatile
  10. (15)卡巴斯基防病毒软件介绍-概述