Protocol Buffer使用转换工具将proto文件转换成Java文件流程及使用
Client与Server的网络通信协议传输使用google protobuf,服务器端使用的是Java
一、 Protocol Buffers
protobuf全称Google Protocol Buffers,是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库。它和XML或者JSON差不多,也就是把某种数据结构的信息,以某种格式(XML,JSON)保存起来,protobuf与XML和JSON不同在于,protobuf是基于二进制的。主要用于数据存储、传输协议格式等场合。那既然有了XML等工具,为什么还要开发protobuf呢?主要是因为性能,包括时间开销和空间开销:
1.时间开销:XML格式化(序列化)和XML解析(反序列化)的时间开销是很大的,在很多时间性能上要求很高的场合,你能做的就是看着XML干瞪眼了。
2.空间开销:熟悉XML语法的同学应该知道,XML格式为了有较好的可读性,引入了一些冗余的文本信息。所以空间开销也不是太好(应该说是很差,通常需要实际内容好几倍的空间)。
二、服务器端生成的proto文件转换成Java文件
示例:proto文件
syntax = "proto3"; option java_package = "com.showly.app.chat.proto";//生成Java文件后的存放路径
option java_outer_classname = "ChatServerProto"; // 聊天内容类型
enum ContentType {
NORMAL = 0; // 普通文本聊天
ANONYMOUS = 1; // 匿名文本聊天(输入框旁边有个勾选)
} // 性别
enum GenderType {
SECRET = 0; // 保密
MALE = 1; // 男
FEMALE = 2; // 女 } // 用户信息
message UserInfo {
int32 uid = 1;
string headPic = 2;
GenderType gender = 3;
bool vip = 4; //Vip
int32 level = 5; //等级
string nickName = 6; //昵称
} // 响应消息的一个头. 每个消息都会带上.
message ResponseHeader {
int32 status = 1; // 状态 非0 为失败
string msg = 2; // 状态描述
} // 聊天使用的消息体对象
message ChatInfo {
UserInfo info = 1; // 用户信息
string location = 2; // 用户的位置.
ContentType type = 3; // 消息类型
bytes content = 4; // 消息内容
int64 dt = 5; // 时间戳
} // cmdId = 1000(客户端传输到服务器端的请求id)
message LoginRequest {
int32 uid = 1; //uid
string token = 2; // token
} // cmdId = 1000000(客户端获取服务器端响应id)
message LoginResponse {
ResponseHeader header = 1;
repeated ChatInfo chats = 2; // 10条历史记录
bool roomReconn = 3; // 房间重连
} // cmdId = 1001 切换城市 世界为 "WORLD"
message ChangeCityRequest {
string city = 1; // city code
} // cmdId = 1000001
message ChangeCityResponse {
ResponseHeader header = 1;
repeated ChatInfo chats = 2;// 10条历史记录
} enum LocationType {
WORLD = 0;//世界信息
REDBAGROOM = 1; //红包活动房间
} // cmdId = 1002
message SendChatMsgRequest {
string location = 1; //位置
ContentType type = 2; // 消息类型
bytes content = 3; // 消息内容. 以后可能图片什么. 我这里不写死. 客户端给我字节数组.
LocationType locationType = 4 ;// 消息位置
} // cmdId = 1000002 推送的聊天信息广播协议
message ChatInfoBroadcastResponse {
ResponseHeader header = 1;
ChatInfo chat = 2; // 广播的内容
LocationType locationType = 3 ;// 消息位置
} // cmdId = 1003 心跳. 不需要发送东西. 告诉服务器还活着
message HeartRequest { } // 这里仅服务端使用这个, 客户端按照下行的id 解析即可.
message DefaultHeaderResponse {
ResponseHeader header = 1; // 头
}
转换流程:
1、这时需要protoc转换工具(公众号回复"protocbuf转换工具")
2、将proto文件放到工具相应的目录(如图)
3、使用如图命令行进行转换
转换后的Java文件为ChatServerProto(生成的文件代码太长,这里不放出来了)
三、Protocol Buffer使用
以使用Netty网络编程框架Protocol Buffer传输为例:
Netty登录请求(此协议为客户端与服务端双方规定好的协议)
// cmdId = 1000
message LoginRequest {
int32 uid = 1; //uid
string token = 2; // token
}
项目代码中使用:
ChatServerProto.LoginRequest loginRequest = ChatServerProto.LoginRequest
.newBuilder()
.setUid(Integer.parseInt(I8ShowSharePre.getHomeId(getActivity())))
.setToken(I8ShowSharePre.getToken(getActivity()))
.build(); MessageContent messageContent = new MessageContent(1000, loginRequest.toByteArray());
//nettyChatClient为netty对象
nettyChatClient.sendMessage(messageContent);
以下是个人公众号(longxuanzhigu),之后发布的文章会同步到该公众号,方便交流学习Android知识及分享个人爱好文章:
Protocol Buffer使用转换工具将proto文件转换成Java文件流程及使用的更多相关文章
- [python]自动化将markdown文件转成html文件
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 使用宏批量将多个csv文件转成excel文件
在一个压缩文件中有100多个csv文件,要求要将此100多个csv文件转成excel文件,名字命名不变,有三种方式: 1. 傻不拉几的复制粘贴法 2. 一个一个打开csv文件,另存为xls文件,工作量 ...
- 将 Python3 文件打包成 exe 文件
我们用 Python 写好的代码,如何给别人在没有配置 Python 环境的情况下直接使用呢?尤其是面向 windows 众. 因为 Python 是一门解释性的语言,离开了 Python 解释器,P ...
- 用gulp把less文件编译成css文件
第一次使用gulp构建工具,使用gulp将.less文件编译成.css文件并输出.根据视频做了笔记.提供新手和自己以后做参考. HTML文件 <!DOCTYPE html> <htm ...
- 将WSDL文件生成的Java文件
- C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件
比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...
- C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件
比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...
- 在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性
在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性 Maven 项目生成jar运行时提示“没有主清单属性” 新建了一个Maven的项目,mvn compile和mvn packag ...
- 将java文件编译成class文件
一般情况下,在myeclipse中保存java文件后会自动编译成class文件,但是这种情况只能编译当前工程的java文件,但是如果需要编译不是一个工程的java文件,比如在网上拷贝的java文件改如 ...
随机推荐
- 修改Hosts不生效的一个场景-web 专题
准备工作 1.在 QQ互联 申请成为开发者,并创建应用,得到APP ID 和 APP Key.2.了解QQ登录时的 网站应用接入流程.(必须看完看懂) 为了方便各位测试,直接把我自己申请的贡献出来:A ...
- WPF中类似使用tab键功能,可以向上向下定位
原文:WPF中类似使用tab键功能,可以向上向下定位 private void tbYyrs_KeyUp(object sender, KeyEventArgs e) { UIElement elem ...
- 详解 Java 8 HashMap 实现原理
HashMap 是 Java 开发过程中常用的工具类之一,也是面试过程中常问的内容,此篇文件通过作者自己的理解和网上众多资料对其进行一个解析.作者本地的 JDK 版本为 64 位的 1.8.0_171 ...
- 【Gerrit】自动设置reviewer
gerrit 提供了一种代码review解决方案,但每次代码提交之后都要设置每个commit的code reviewer, 实在是痛苦. gerrit 在官方说明文档里面提供了解决方法,地址:http ...
- 微信小程序把玩(十五)checkbox组件
原文:微信小程序把玩(十五)checkbox组件 不得不吐糟下checkbox默认样式真是有点略丑!!!checkbox组件为一个多选框被放到checkbox-group组中,并在checkbox-g ...
- /\B(?=(?:\d{3})+$)/g 一条令人费解的正则表达式
网上浏览博客看到要用JavaScript正则表达式解决一个功能, 要在数字中间插入逗号, 用来表示书面的金额写法. JS代码是这样子的 let test1 = '1234567890' let for ...
- TIFF图片简介
每个TIFF文件都是从指示字节顺序的两个字节开始的.“II”表示小字节在先.“MM”表示大字节在先字节顺序.后面的两个字节表示数字42.数字42是“为了其深刻的哲学意义"而选择的. 42的读 ...
- Advanced Installer 中测试数据库连接提示“未发现数据源名称并且未指定默认驱动程序”的解决办法
原文:Advanced Installer 中测试数据库连接提示"未发现数据源名称并且未指定默认驱动程序"的解决办法 最近需要制作一个安装包,安装包的要求如下: 1.用户手工填写M ...
- 青云QingCloud宣布完成C轮融资,金额1亿美元
本轮融资由两家人民币基金领投,蓝驰创投跟投. 企业级基础云服务商青云QingCloud正式宣布完成金额为1亿美元的C轮融资,本轮融资由两家人民币基金领投,蓝驰创投跟投. 青云QingCloud公司成立 ...
- 【Windows Universal Platform】只是学习笔记 - 开始
我是初学,之前没有windows/windows phone的应用开发经验:开博的目的只是记录和督促自己学习. 心血来潮也好,或是个人喜好的原因,想学着自己开发APP了(PS:以前做过web 开发) ...