博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据传输协议protobuf的使用及案例
阅读量:5165 次
发布时间:2019-06-13

本文共 4388 字,大约阅读时间需要 14 分钟。

一、交互流程图:

总结点:

问题:一开始设置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(101);        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, "1234567890123456");        //封装最外层数据        org.chench.test.protobuf.messages.Amsg.Builder msg = org.chench.test.protobuf.messages.Amsg.newBuilder();        msg.setContentValue("zYaIF1toXcw=");        msg.setContentId("1HEABwINCAcOAQ==");        msg.setVersionType("1001");        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(15000);        connection.setReadTimeout(60000);        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 == 200) {        }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对含数据请参考安全热更请求数据}

  

 

转载于:https://www.cnblogs.com/gxyandwmm/p/11437417.html

你可能感兴趣的文章
PHP实现一个简陋的注册登录页面
查看>>
用两个栈实现队列
查看>>
2015最新--浏览器分布图
查看>>
bloom特效
查看>>
R_数据视觉化处理_中阶_05
查看>>
JavaScript的类型自动转换样例集合处
查看>>
最大公约数和最小公倍数问题
查看>>
A. 定义常量以及检测常量
查看>>
[python]socket.listen(backlog)中的backlog含义
查看>>
【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则
查看>>
详解java类的生命周期
查看>>
centos普通用户添加sudo权限
查看>>
快速搭建微信小程序开发环境
查看>>
[全文下载/试读]补充,上集Ch. 3 -- Panel控件与常用属性,范例:问卷系统,动态产生「子问题」(使用障眼法)...
查看>>
Guava学习笔记:Guava新增集合类型-Multiset
查看>>
根据入栈判断出栈是否合法
查看>>
[Algorithm]查找
查看>>
OC语法6——内存管理之引用计数器(retain,release)
查看>>
.Net学习笔记----2015-07-10(基础复习和练习09)
查看>>
CSDN-markdown基本的语法说明
查看>>