C++ ProtoBuf Java 通信

簡要

C++使用libcurl作爲HttpClient
Java作爲WebServer
ProtoBuf作爲通信協議.

需求

簡單講下, 畢竟是項目中運用前的小demo.

客戶端有很多的點, 要發送給web服務端, 服務端進行接收再進行回調(回調就屬於其他項目了, 這裏並未設計)

protobuf

定義點類型, 在定義點雲類型. 詳情請見protobuf官網

syntax = "proto3";
package cn.chennan.server.proto;

message Point3f {
	float x = 1;
	float y = 2;
	float z = 3;
}

message PointCloud {
    int32 total = 1;
	repeated Point3f map_points = 2;
}

客戶端

CMakeLists

具體詳見CMakeLists, 挑需要注意的地方講講

  • 涉及到protobuf, find_package(Protobuf REQUIRED, 沒有protobuf, 需要進行安裝
  • 因爲protobuf, 所以在編譯的時候需要把protobuf相關類庫加載, 那幾條關於protobuf的都是.
  • 涉及到http, 所以需要添加find_package(CURL REQUIRED), 沒有curl需要進行安裝.
  • 因爲curl, 所以在編譯的時候需要加參數 -lcurl

主程序

基本沒啥講的, 看一眼就懂
需要注意的是, 需要protobuf的請求頭 m_header = curl_slist_append( m_header, "Content-Type: application/x-protobuf" );

point_cloud.SerializeToString(&sReq) 就是protobuf的api, 將對象序列化. 用這個進行傳輸
resp.ParseFromString(sResp) 反序列化.

服務端

Maven

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.8.0</version>
</dependency>

編譯protobuf

Java需要手動編譯, 我是在 server/src/main 下打開的終端.
-I : protobuf 文件所在目錄
-java_out : 輸出到哪裏
最後一個參數 : protobuf 文件名

~/protobuf-C-Java/Server/src/main$ protoc -I=resources/cn/chennan/server --java_out=java http.proto

HttpController

跟正常web服務一樣, @RequestMapping@REsponseBody
主要用到的是流, 所以需要request.getInputStream()
然後就如出一轍了, 使用 parseFrom 反序列化.
看最後是否需要返回內容, 需要的話, 就把String改成void, 把註釋打開照着寫即可.

最後

最後的最後, 是我用了一天的時間摸索的… 主要確實沒有相關文檔, 既跨語言, 又需要http. 希望此文檔對你有所幫助~

項目的github

https://github.com/llCnll/protobuf-C-Java

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章