数据传输协议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开发框架的总体思路,对各个层次的基类进行了一些总结和抽象,已达到重用.简化代码的目的.本篇继续分析其中重要 ...
随机推荐
- No module named 'pip._vendor.progress.helpers' 的解决方法
莫名其妙的pip出现故障了 ModuleNotFoundError: No module named ‘pip._vendor.progress.helpers’ 在百度搜索了一圈也没看到这个错误的解 ...
- 校验正确获取对象或者数组的属性方法(babel-plugin-idx/_.get)
背景: 开发中经常遇到取值属性的时候,需要校验数值的有效性. 例如: 获取props对象里面的friends属性 props.user && props.user.friends &a ...
- Laravel Passport API 认证使用小结
Laravel Passport API 认证使用小结 八月 4, 2017 发布在 Laravel 看到Laravel-China 社区常有人问 Laravel Passport 用于密码验证方式来 ...
- hdu 5869 Different GCD Subarray Query BIT+GCD 2016ICPC 大连网络赛
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- Linux长格式文件属性介绍
长格式文件属性 查看长格式文件命令:ll (或ls -l) (1)-:文件类型 -:普通文件 d:目录 b:块设备文件(随机读取) c:字符设备文件(顺序读取) p:管道文件 s:Socket套接字文 ...
- 年视图,选择月份 ---bootstrap datepicker
$.fn.datepicker.dates['cn'] = { //切换为中文显示 days: ["周日", "周一", "周二", &qu ...
- [CSP-S模拟测试]:C(倍增+数学)
题目传送门(内部题152) 输入格式 第一行两个整数$N,Q$. 接下来一行$N$个整数,第$i$个为$a_i$. 接下来的$N-1$行,每行两个整数$u,v$.表示$u,v$之间有一条边. 接下来的 ...
- 【Eureka】Eureka 是什么
Eureka是什么? Eureka 是 Netflix 的一个子模块,也是核心模块之一.Eureka 是一个基于 Rest 的服务,用于定位服务,以实现云端中间层服务发现和故障转移.服务注册和发现对于 ...
- Manifest merger failed with multiple errors, see logs
Manifest merger failed with multiple errors, see logs 错误解决 合并 manifest 错误. https://blog.csdn.net/u01 ...
- [Java]字符串数组 与 字符串链表 之间的相互转化
代码: package com.hy; import java.util.Arrays; import java.util.Collections; import java.util.List; pu ...