目录

1、Java项目引用

2、protobuf 的文件定义格式

基础类型

特殊字段

3、生成java类

4、使用协议

5、如何在游戏项目中使用


游戏服务器和客户端的通信有很多种形式,有的用http,有的用websocket,不过最常见的还是socket服务器,socket 服务器在游戏中是最常见的,至于为什么和怎么创建,等以后再说,今天先来聊聊服务器和客户端交谈的协议。协议的定义是服务端和客户端沟通的结果,形成一致的数据格式,这样大家才好解析,知道对方在说什么,在做什么。

在最初的时候有的人自定义格式,虽然紧凑,但是可能会存在一些问题,不够稳定。也有的人用xml,也有人用json,存在的问题就是格式虽然很好,但是网络包太大,不太适合,问题存在必然就要解决,有没有一种方案可以解决上面的问题?答案显而易见,就是今天聊的protobuf。

protobuf 是谷歌开源的跨平台的一种通讯协议,更紧凑,更高效。废话不多说,进入正文。

1、Java项目引用

pom.xml 中加入以下依赖,版本可以自己根据需要进行选择

<dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.6.1</version>
</dependency>

2、protobuf 的文件定义格式

option java_package ="com.gamwatcher.soulmsg";
option java_outer_classname = "SoulMsg";
option java_multiple_files = true;
message SOUL_UP_OUT{required int64 uid =1;repeated int64 costuid =2;optional int64 useExp = 3;
}

基础类型

.proto类型 java类型 备注
double double  
float float  
int32 int 使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint32。
int64 long 使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint64。
unit32 int[1] 总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。
unit64 long[1] 总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。
sint32 int 使用可变长编码方式。有符号的整型值。编码时比通常的int32高效。
sint64 long 使用可变长编码方式。有符号的整型值。编码时比通常的int64高效。
fixed32 int[1]  
fixed64 long[1] 总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。
sfixed32 int 总是4个字节。
sfixed64 long 总是8个字节。
bool boolean  
string String 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。
bytes ByteString 可能包含任意顺序的字节数据

特殊字段

英文 中文 备注
enum 枚举(数字从零开始) 作用是为字段指定某”预定义值序列” enum Type {MAN = 0;WOMAN = 1; OTHER= 3;}
message 消息体 message User{}
repeated 数组/集合 repeated User users  = 1
import 导入定义 import "protos/other_protos.proto"
// 注释 //用于注释
extend 扩展 extend User {}
package 包名 相当于命名空间,用来防止不同消息类型的明明冲突

3、生成java类

下载protoc:https://github.com/protocolbuffers/protobuf/releases

protoc.exe --java_out = ../../src/main/java **.proto

4、使用协议

SOUL_UP_OUT.Builder builder = SOUL_UP_OUT.newBuilder();
builder.setUid(1);
builder.addAllCostUid(costUidList);
builder.setUserExp(1000)
builder.build()

5、如何在游戏项目中使用

正常的协议格式:

len + 加密的 [headMsgId + proto二进制数据]

常用的加密算法:AES和RSA,DES,选择一个简单的效率高的,如果游戏大火了可以换一个稍微复杂的加密算法,小事情,不重要

客户端解析出根据长度读出数据长度进行解析。so easy!!!,服务端同样的规则。客户端和服务器通信就是这么简单。

总结:protobuf 不过是一个协议格式,省去了我们自定义消息的过程,既然有现成的轮子就没必要自己造了,况且我们造的还不如别人,先会用,再去了解原理,没什么大不了。

想破解游戏协议?你知道客户端和服务器是怎么通信的?我来告诉你怎么定义的相关推荐

  1. 客户端和服务器之间的信息结构,客户端与服务器之间的通信过程

    客户端与服务器之间的通信过程 内容精选 换一换 一.HTTP概念超文本传输协议(HTTP,HyperTextTransferProtocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必 ...

  2. 客户端与服务器之间的通信过程

    客户端与服务器之间的通信过程主要分为三步:请求--处理--响应 1.客户端发起请求 2.服务器处理本次请求 3.服务器响应客户端

  3. udp 全双工通信 linux,客户端和服务器实现全双工通信(基于线程)

    客户端和服务器实现全双工通信(基于线程) 1. 基于多线程实现一个服务器和一个客户端实现全双工通信 服务器端创建两个线程:一个用于接收客户端发送过来的信息:一个用来给客户端发送信息. 客户端也创建两个 ...

  4. VB6 通过winsock控件数组实现客户端和服务器多对一通信

    说明:我是在最近开发一个考试系统过程中搜索到上面文章的,它提供的思想非常实用.当然,这篇文章仅提供了一个基本思路,详细的实现在人民邮电出版社出版的<Visual Basic网络通信协议分析与应用 ...

  5. java iso8583 socket 服务_JAVA客户端amp;服务器的socket通信

    JAVA客户端&服务器的socket通信 socket是两台主机之间的一个连接通道,它可以完成七个基本操作: 发送远程机器 发送数据 接收数据 关闭连接 绑定端口 监听入站数据 再绑定端口上接 ...

  6. Android客户端与服务器之间的通信

    本文将介绍Android客户端与服务器端的通信的简单实现方法. 要两点需要注意的地方: 1.Android 端记得在AndroidManifest.xml里记得获取一下网络权限,否则无法进行网络通信, ...

  7. 客户端和服务器实现全双工通信(基于线程)

    http://blog.sina.com.cn/s/blog_87766e4a0100yp7a.html 1. 基于多线程实现一个服务器和一个客户端实现全双工通信 服务器端创建两个线程:一个用于接收客 ...

  8. 如何使用数据包破解游戏 - 从这里开始

    什么是包? 您的游戏客户端和服务器始终处于通信状态.从一个到另一个的每次传输称为一个数据包. 有时它是由一系列数据包组成的数据包"流",有时它只是一个具有个人用途的数据包. 游戏使 ...

  9. 一种即时通信数据传输方法、客户端、服务器及系统

    一种即时通信数据传输方法.客户端.服务器及系统  摘要 本发明实施例提供一种即时通信数据传输方法.客户端.服务器及系统,其中,方法可以包括:向服务器发送传输控制协议TCP连接建立请求,建立与所述服务器 ...

最新文章

  1. 深究AngularJS——过滤器(filter)
  2. linux中export和source的作用和区别
  3. easyui不同的jsp页面之间混乱_16.jsp九大内置对象,四大作用域
  4. 中导入pygame_Pygame(二)--线条的艺术
  5. Axure实现多用户注册验证
  6. bird 报表_轻松完成Birt报告
  7. 奇妙的安全旅行之MD算法
  8. utf8编码为什么这么普遍,优势在哪里?
  9. 数学-矩阵计算(2)矩阵函数微积分前奏
  10. Android新手入门2016(14)--FragmentTabHost实现选项卡和菜单
  11. html调用rpst 源码_parseHTML 函数源码解析(四) AST 基本形成
  12. Androidstudio加载工程很慢解决方案
  13. URLDecoder解码报错
  14. html在线拍照功能,html5实现调用摄像头并拍照功能
  15. 使用Python+百度AI把文字转成语音
  16. 高一计算机课期中考试总结反思,高一期中考试总结反思1300字
  17. 生产计划管理APS系统在食品调味品/复合调味品行业的应用(2)--APS系统功能介绍
  18. 某海外电商平台参数分析 ECDSA签名(js逆向)
  19. 反相器的Cadence仿真
  20. 误删的苹果电脑硬盘和数据库的数据怎么恢复

热门文章

  1. Windows分盘,c盘已经满了,但d盘还有内存。
  2. 在Mac上模拟IE浏览器
  3. rpm安装包安装方式
  4. [JavaScript]使用opencv.js实现基于傅里叶变换的频域水印(隐水印)
  5. [转载] excel调用python编程-超简单:用Python让Excel飞起
  6. PPPoE协议应用场景
  7. 0.96英寸128*64 OLED显示二维码
  8. pat甲级考试报名费_2019吉林省公务员考试笔面心得
  9. win10自动修复无法修复你的电脑的解决方法(操作+原理理解)
  10. 更改电脑本地用户名,将中文用户名给为英文名称