正文前先來一波福利推薦:
福利一:
百萬年薪架構師視頻,該視頻可以學到很多東西,是本人花錢買的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對含數據請參考安全熱更請求數據
}