数据传输协议protobuf的使用及案例
正文前先来一波福利推荐:
福利一:
百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。
福利二:
毕业答辩以及工作上各种答辩,平时积累了不少精品PPT,现在共享给大家,大大小小加起来有几千套,总有适合你的一款,很多是网上是下载不到。
获取方式:
微信关注 精品3分钟 ,id为 jingpin3mins,关注后回复 百万年薪架构师 ,精品收藏PPT 获取云盘链接,谢谢大家支持!

------------------------正文开始---------------------------
一、交互流程图:
总结点:
问题:一开始设置http请求中content-type 设置为默认文本格式,导致使用http传输body信息的时候必须进行base64加密才可以传输,这样会导致增加传输1/3的数据量,
解决:使用流进行写入与读取,客户端请求中使用inputStream,服务端使用outputStream,http数据格式设置application/octet-stream;

二、示例代码:
服务端:
private static void sendProtobufObject() throws Exception {
org.chench.test.protobuf.OriginalData.Tdata.Rdata.Builder rdata = org.chench.test.protobuf.OriginalData.Tdata.Rdata.newBuilder();
rdata.setV();
rdata.setC("got doub");
rdata.setR("test");
rdata.setRS("rolen1");
org.chench.test.protobuf.OriginalData.Tdata.Builder tdata = org.chench.test.protobuf.OriginalData.Tdata.newBuilder();
tdata.setDatatype("aias");
tdata.setIdVer("An1");
tdata.setTrans("y");
tdata.setRk("uZkmGAC=");
tdata.addData(rdata);
org.chench.test.protobuf.OriginalData.Tdata staff = tdata.build();
byte[] buff = staff.toByteArray();
//String source = new String(buff, "utf-8");
byte[] payload = Encrypt(buff, "");
//封装最外层数据
org.chench.test.protobuf.messages.Amsg.Builder msg = org.chench.test.protobuf.messages.Amsg.newBuilder();
msg.setContentValue("zYaIF1toXcw=");
msg.setContentId("1HEABwINCAcOAQ==");
msg.setVersionType("");
msg.setPayload(ByteString.copyFrom(payload));
URL url = new URL("http://127.0.0.1:9090/api/v1/suss_msg");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setConnectTimeout();
connection.setReadTimeout();
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("Content-Type", "application/octet-stream");
//connection.connect();
// 通过连接对象获取一个输出流
OutputStream os = connection.getOutputStream();
// 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
os.write(msg.build().toByteArray());
///msg.build().writeTo(connection.getOutputStream());
os.flush();
os.close();
int responseCode = connection.getResponseCode();// 调用此方法就不必再使用conn.connect()方法
if (responseCode == ) {
}else
{
}
connection.disconnect();// 关闭连接
客户端:
public Object processRequest(HttpServletRequest request) throws Exception
{
//new BASE64Decoder().decodeBuffer(requestBody)
InputStream inputStream = request.getInputStream();
messages.Amsg msg = messages.Amsg.parseFrom(inputStream);
System.out.println("----------header-------------");
System.out.println(msg.getContentValue());
System.out.println(msg.getContentId());
System.out.println(msg.getVersionType()); System.out.println("----------payload-------------");
byte[] data = Decrypt(msg.getPayload().toByteArray(), "1234567890123456");
OriginalData.Tdata tdata = OriginalData.Tdata.parseFrom(data);
System.out.println("----------tdate:");
System.out.println(tdata.getAid());
System.out.println(tdata.getDatatype());
System.out.println(tdata.getIdVer());
System.out.println(tdata.getTrans());
System.out.println(tdata.getRk()); System.out.println("----------rdate:");
OriginalData.Tdata.Rdata rdata = tdata.getData(0);
System.out.println(rdata.getA());
System.out.println(rdata.getP());
System.out.println(rdata.getM());
System.out.println(rdata.getGJ()); return null;
}
Schema:
syntax = "proto3"; package msg; option java_package = "org.chench.test.protobuf";
option java_outer_classname = "messages"; message Amsg {
string content_value = 1;
string content_id = 2; //appid
string version_type = 3; //协议类型
bytes payload = 4; //加密数据
}
syntax = "proto3"; package originaldata; option java_package = "org.chench.test.protobuf";
option java_outer_classname = "OriginalData"; message Tdata {
string aid = 1;
string datatype = 2;
string hk = 3;
string id_ver = 4;
message Rdata{
int32 V = 1;
int32 oo = 2; //为区分大小写,原小写字母变为双小写
string pp = 3; }
repeated Rdata data = 5; //rdata对含数据请参考安全热更请求数据 }
数据传输协议protobuf的使用及案例的更多相关文章
- DDTP 分布式数据传输协议白皮书
声明 本文非本人原创,主要参考文献[1]编写的阅读笔记.本博客仅发表在博客园,作者LightningStar,其他平台均为转载. 摘要 本白皮书对全球现有主要个人信息可携带权的实践模式进行梳理,分析其 ...
- protobuf Protocol Buffers 简介 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 网络协议之:基于UDP的高速数据传输协议UDT
目录 简介 UDT协议 UDT的缺点 总结 简介 简单就是美.在网络协议的世界中,TCP和UDP是建立在IP协议基础上的两个非常通用的协议.我们现在经常使用的HTTP协议就是建立在TCP协议的基础上的 ...
- 哈工大 计算机网络 实验二 可靠数据传输协议(停等协议与GBN协议)
计算机网络实验代码与文件可见github:计算机网络实验整理 实验名称 可靠数据传输协议(停等协议与GBN协议) 实验目的: 本次实验的主要目的. 理解可靠数据传输的基本原理:掌握停等协议的工作原理: ...
- 三种通用应用层协议protobuf、thrift、avro对比,完爆xml,json,http
原文: https://www.douban.com/note/523340109/ Google protobuf: 优点 二进制消息,性能好/效率高(空间和时间效率都很不错) proto ...
- 【Canal源码分析】数据传输协议
Canal的数据传输有两块,一块是进行binlog订阅时,binlog转换为我们所定义的Message,第二块是client与server进行TCP交互时,传输的TCP协议. 一.EntryProto ...
- 类似于xml的一种数据传输格式protobuf
1.Protobuf 简介 Protocol Buffer是google 的一种数据交换的格式,已经在Github开源,目前最新版本是3.1.0.它独立于语言,独立于平台.google 提供了多种语言 ...
- TCP学习前的准备——可靠数据传输协议
由于传输层所依赖的网络层是不可靠的,通过逐渐考虑实际情况不断引入新技术来实现可靠数据传输. 完全可信的信道 有比特差错的信道 新的协议功能: 1. 差错检测:检验和 2. 接收方反馈:序号 ...
- Socket开发框架之数据传输协议
我在前面一篇随笔<Socket开发框架之框架设计及分析>中,介绍了整个Socket开发框架的总体思路,对各个层次的基类进行了一些总结和抽象,已达到重用.简化代码的目的.本篇继续分析其中重要 ...
随机推荐
- 【Android-自定义控件】SwipeRefreshDemo 下拉刷新,上拉加载
参考:https://github.com/PingerOne/SwipeRefreshDemo 谷歌官方的SwipeRefreshLayout控件,只有下拉刷新功能. 自定义的SwipeRefres ...
- Luogu P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理+容斥原理
真是菜到爆炸....容斥写反(反正第一次写qwq) 题意:$n-1$个公司,每个公司可以连一些边,求每个边让不同公司连的生成树方案数. 矩阵树定理+容斥原理(注意到$n$不是很大) 枚举公司参与与否的 ...
- 两种dp模型
两个常见模型 bzoj 4321 题意:编号为1~n的人排成一排,问有多少种排法使得任意相邻两人的编号之差不为1或-1. n<=1000 排列计数问题:考虑把数从小到大插入的过程进行dp. 设 ...
- jQuery系列(八):jQuery的位置信息
1.宽度和高度 (1):获取宽度 .width() 描述:为匹配的元素集合中获取第一个元素的当前计算宽度值.这个方法不接受任何参数..css(width) 和 .width()之间的区别是后者返回一个 ...
- 【线性代数】2-5:逆(Inverse)
title: [线性代数]2-5:逆(Inverse) toc: true categories: Mathematic Linear Algebra date: 2017-09-11 20:00:1 ...
- E. Intergalaxy Trips
完全图,\(1 \leq n \leq 1000\)每一天边有 \(p_{i,j}=\frac{A_{i,j}}{100}\) 的概率出现,可以站在原地不动,求 \(1\) 号点到 \(n\) 号点期 ...
- deepin grub2017年11月13日折腾记录
http://blog.csdn.net/atbird0321/article/details/78158194 https://bbs.deepin.org/forum.php?mod=viewth ...
- django快速实现完整登录系统,把登陆注册串在一起并增加cookie(六)
1.使用之前创建的项目和应用 mysite3 account 2.使用之前的数据库构造 class User(models.Model): username=models.CharField(max ...
- yield and send的使用详细解释
https://blog.csdn.net/mieleizhi0522/article/details/82142856 虽然并不完全正确,但是能在使用中帮我们拨开迷雾 再结合另外一篇文章理解了htt ...
- qt 之http学习
在Qt网络编程中,需要用到协议,即HTTP.它是超文本传输协议,它是一种文件传输协议. 新建工程名为“http”,然后选中QtNetwork模块,最后Base class选择QWidget.注意:如果 ...