以前的通讯架构有点乱七八糟,自己写协议,自己写通讯,关键内容也是都很简单。
想尝试下grpc。
装好了grpc,现在开始正式入门。
算是个记录贴吧。
先从protobuf开始。
按习惯先建立文件系统:
protobuf_study/
src/
include/
lib/
test/
CMakeLists.txt
user_info.proto
user_info.proto如下:
syntax = "proto3";
message User {
string name = 1;
int64 age = 2;
string phone_number = 3;
}
随后在系统根目录使用:
protoc --cpp_out=./src/ user_info.proto
在src文件夹下新生成了两个新文件:
user_info.pb.h
user_info.pb.cc
个人习惯,将.h文件移动至include/中,项目文件夹变为:
protobuf_study/
src/
user_info.pb.cc
include/
user_info.pb.h
lib/
test/
test1.cpp
CMakeLists.txt
user_info.proto
test1.cpp内容为:
#include "user_info.pb.h"
int main() {
User test;
test.set_name("OhItsMeDuh");
test.set_age(22);
test.set_phone_number("110112119");
test.set_name(test.name() + " didn't see that coming huh");
std::cout << "the size of this user is: " << test.ByteSizeLong() << std::endl;
std::cout << "serialize as string: " << test.SerializeAsString() << std::endl;
std::string k = "asdf12a3a1123123123123123";
std::cout << "k size was: " << k.size() << std::endl;
test.AppendToString(&k);
std::cout << "now k size become: " << k.size() << std::endl;
std::cout << k << std::endl;
return 1;
}
CMakeLists为:
cmake_minimum_required(VERSION 3.10)
project(ProtobufStudy)
set(ROOT_DIR ${PROJECT_SOURCE_DIR})
set(LIB_DIR ${PROJECT_SOURCE_DIR}/lib)
set(SRC_DIR ${PROJECT_SOURCE_DIR}/src)
set(INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
set(TEST_DIR ${PROJECT_SOURCE_DIR}/test)
set(EXE_DIR ${PROJECT_SOURCE_DIR}/exe)
set(LIBRARY_OUTPUT_PATH ${LIB_DIR})
SET(EXECUTABLE_OUTPUT_PATH ${EXE_DIR})
include_directories(${INCLUDE_DIR})
link_directories(${LIB_DIR})
add_library(UserInfo ${SRC_DIR}/user_info.pb.cc)
target_link_libraries(UserInfo protobuf)
add_executable(test1 ${TEST_DIR}/test1.cpp)
target_link_libraries(test1 UserInfo)
运行结果(有些字符显示不出来。。嗯。。):
the size of this user is: 52
serialize as string:
%OhItsMeDuh didn't see that coming huh 110112119
k size was: 25
now k size become: 77
asdf12a3a1123123123123123
%OhItsMeDuh didn't see that coming huh 110112119