用于提升自己编程技能的一个从0开始的项目。
目前还在开发中。
todo:
- 增强鲁棒性:call函数调用失败时的处理,连接失败的处理
- 构建异常模块,用于快速定位异常位置
- RPCServer与RPCClient提供线程池,定时器的接口,方便用户直接调用内置模块
- 将所有的超参数放到prg_cfg文件中
RPCServer
int add(int a, int b) {
return a + b;
}
std::string append(std::string a, std::string b) {
return a + b;
}
int main() {
Rpc_Server server(23333);
server.register_method("add", add);
server.register_method("append", append);
server.run();
return 0;
}
RPCClient
int main() {
Rpc_Client client("127.0.0.1", 23333);
client.run();
int res = client.call<int>("add", 1, 2);
std::cerr << "res : " << res << std::endl;
std::string appendedString = client.call<std::string>("append", "hello ", "world");
std::cerr << "ans: " << appendedString << std::endl;
while(1) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
return 0;
}
RPCServer
class myClass :public enable_serializable { // 1.公开继承自enable_serializable类
public:
int a, b;
myClass operator+(const myClass& other) const {
myClass ret;
ret.a = this->a + other.a;
ret.b = this->b + other.b;
return ret;
}
SERIALIZE(a, b) // 2.设置所有的成员变量
};
myClass add4(myClass a, myClass b) {
return a + b;
}
int main() {
Rpc_Server server(23333);
server.register_method("add4", add4);
server.run();
return 0;
}
RPCClient
// 客户端也要有相同的类的定义
class myClass :public enable_serializable {
public:
int a, b;
myClass operator+(const myClass& other) const {
myClass ret;
ret.a = this->a + other.a;
ret.b = this->b + other.b;
return ret;
}
SERIALIZE(a, b)
};
int main() {
Rpc_Client client("127.0.0.1", 23333);
client.run();
myClass a, b;
a.a = 10;
a.b = 20;
b.a = 30;
b.b = 40;
auto ret = client.call<myClass>("add4", a, b);
std::cout << ret.a << " " << ret.b << std::endl;
while(1) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
return 0;
}
客户端与服务端使用的压缩算法要一致!
RPCServer
int main () {
Rpc_Server server(23333);
// 设置服务器的压缩算法
server.set_compress_algo(Compression_Type::Brotli); // 使用Brotli算法压缩数据
server.register_method("add", add);
server.run();
return 0;
}
RPCClient
int main() {
Rpc_Client client("127.0.0.1", 23333);
// 设置客户端的压缩算法
client.set_compress_algo(Compression_Type::Brotli);
client.run();
int res = client.call<int>("add", 1, 2);
std::cerr << "res : " << res << std::endl;
while(1) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
return 0;
}
RPCServer
class Generator {
public:
int get_new_id() {
return _id++;
}
private:
int _id { 1 };
};
int main {
Rpc_Server server(23333);
Generator gen;
server.register_method("requestID", [&]() {
return gen.get_new_id();
});
server.run();
return 0;
}
RPCClient
int main {
Rpc_Client client("127.0.0.1", 23333);
client.run();
while(1) {
std::cout << client.call<int32_t>("requestID") << std::endl;
std::cout << "send test message" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds (1000));
}
return 0;
}