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文件流程及使用的更多相关文章

  1. [python]自动化将markdown文件转成html文件

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  2. 使用宏批量将多个csv文件转成excel文件

    在一个压缩文件中有100多个csv文件,要求要将此100多个csv文件转成excel文件,名字命名不变,有三种方式: 1. 傻不拉几的复制粘贴法 2. 一个一个打开csv文件,另存为xls文件,工作量 ...

  3. 将 Python3 文件打包成 exe 文件

    我们用 Python 写好的代码,如何给别人在没有配置 Python 环境的情况下直接使用呢?尤其是面向 windows 众. 因为 Python 是一门解释性的语言,离开了 Python 解释器,P ...

  4. 用gulp把less文件编译成css文件

    第一次使用gulp构建工具,使用gulp将.less文件编译成.css文件并输出.根据视频做了笔记.提供新手和自己以后做参考. HTML文件 <!DOCTYPE html> <htm ...

  5. 将WSDL文件生成的Java文件

  6. C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件

    比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...

  7. C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件

    比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...

  8. 在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性

    在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性 Maven 项目生成jar运行时提示“没有主清单属性” 新建了一个Maven的项目,mvn compile和mvn packag ...

  9. 将java文件编译成class文件

    一般情况下,在myeclipse中保存java文件后会自动编译成class文件,但是这种情况只能编译当前工程的java文件,但是如果需要编译不是一个工程的java文件,比如在网上拷贝的java文件改如 ...

随机推荐

  1. WPF DataGrid自定义列DataGridTextColumn.ElementStyle和DataGridTemplateColumn.CellTemplate

    <Window x:Class="DataGridExam.MainWindow"        xmlns="http://schemas.microsoft.c ...

  2. C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)

    原文:C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值) 1.问题的提出: 电池生产中,遇到一批电池的测量结果数据: 电压值 电池个数 电压值 电池个数 电压值 电池个数 电 ...

  3. JS引用路劲为什么在前面加上两个斜杠

    原文:JS引用路劲为什么在前面加上两个斜杠 //表示同协议,一般现在用在https跨域名地址情况下.比如第三方统计代码的引入,用//就不用很麻烦地区分https还是http,也不用担心https下降到 ...

  4. synchronized 专题

    这几天不断添加新内容,给个大概的提纲吧,方面朋友们阅读,各部分是用分割线隔开了的: synchronized与wait()/notify() JMM与synchronized ThreadLocal与 ...

  5. jdbc连接oracle数据库字符串

    jdbc连接oracle数据库有两种方式: 连接数据库SID 连接数据库service_name 当连接SID时,字符串如下: url::orcl1" password="xxxx ...

  6. C#的Task、async、await关键字

    Task,一个类,可以执行一个方法,构造函数需要传一个Action类型的委托,Action类型的委托是可以拥有多个参数,没有返回值的. Task<T> Task的泛型,构造函数传入一个Fu ...

  7. DateTimeToGreenUnix

    @暗夜魔尊 { Unix date conversion support with time-zone detect } function DateTimeToGreenUnix(const AVal ...

  8. C# ACCESS 向含有自动编码字段表中添加记录提示“查询值的数目与目标字段中的数目不同”

    引发错误的SQL语句如下: sqlStr = "insert into tb_ReportLog values('" + DevSite + "','" + D ...

  9. windows下Qt5.2 for android开发环境搭建

    windows下Qt5.2 forAndroid开发环境配置 1.下载安装Qt 5.2.0 for Android (Windows 32-bit)   http://qt-project.org/d ...

  10. Delphi指针运用理解

    现在是面向对象漫天飞的年代了,大家都在在谈面向对象编程.Java对指针“避而不谈”,C#虽然支持指针运用,但是也淡化处理. 然而,指针还是好完全掌握为妙,省得在开发过程碰钉子,至于对指针的运用在于开发 ...