簡要
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. 希望此文檔對你有所幫助~