數據傳輸協議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(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對含數據請參考安全熱更請求數據

}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM