数据传输协议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开发框架的总体思路,对各个层次的基类进行了一些总结和抽象,已达到重用.简化代码的目的.本篇继续分析其中重要 ...
随机推荐
- Java一道奇特的面试题
1.面试题 2.答案
- Can't connect to MySQL server on xxx (10061)
报错原因,数据库服务没有启动,在JDBC连接mysql数据库时会报错 解决方式,在服务中启用Mysql 备注:运行环境: windows10 x64 JDK 1.8.0_181 mysql-conne ...
- mysql日常优化细节
# sql语句优化> 1)使用limit限制一次性查询出的数据量2)链接查询代替子查询3)尽量不要使用select * ,将需要查找的字段列出来4)如果数据量特别大的话尽量将一条复杂的sql拆分 ...
- [Luogu] 选择客栈
https://www.luogu.org/problemnew/show/P1311 思路就是,从1到n枚举,输入color和price的值,我们需要记录一个距离第二个客栈最近的咖啡厅价钱合理的客栈 ...
- js毫秒数转换为具体日期
[1].毫秒数转换为具体日期 function getMyDate(str) { var oDate = new Date(str), oYear = oDate.getFullYear( ...
- 第十四周课程总结&实验报告(简单记事本的实现)
1.JDBC概述 JDBC提供了一种与平台无关的用于执行SQL语句的标准JavaAPI,可以方便的实现多种关系型数据库的统一操作,它由一组用Java语言编写的类和接口组成 主要常用操作类与接口: ja ...
- ArcGIS Python 坐标系信息
############################################################# import arcpy import os from arcpy impo ...
- ios-tableViewcell展开与收缩动画处理
[前言] 在使用华尔街见闻 app 时,看到它的 tableVeiw 上的 cell 具有很好的展开与收缩功能.于是自己想了一下实现,感觉应该挺简单的,于是心痒痒写个 demo 实现一波.华尔街见闻 ...
- UML分类
类型 静态图 行为图 用例图 交互图 ...
- 根据需求定制 admin
定义 list 页面 自定义 list_filter 首先,完成过滤器的功能,需要自定义过滤器.在 PostAdmin 定义的上方定义如下代码: class CategoryOwnerFilter(a ...