[实现Rpc] 消息类型的测试 | dynamic_pointer_cast | gdb使用

目录

Request

RpcRequest测试:

[⭕ debug_1:dynamic_pointer_cast](#⭕ debug_1:dynamic_pointer_cast)

TopicRequest测试

ServiceRequest测试

⭕debug_2:gdb

Response

RpcResponse测试

TopicResponse测试

ServiceResponse测试


Request

RpcRequest测试:

复制代码
#include "message.hpp"

using namespace bitrpc;

int main()
{
	RpcRequest::ptr rrp = MessageFactory::create<RpcRequest>();

    Json::Value param;
    param["num1"] = 11;
    param["num2"] = 22;

    rrp->setMethod("Add");
    rrp->setParams(param);

    std::string ret = rrp->serialize();
    std::cout << ret << std::endl;

//

    BaseMessage::ptr bmp = MessageFactory::create(MType::REQ_RPC);
    bool res = bmp->unserialize(ret);
    if(bmp->check() == false)
    {
        return -1;
    }

//!!!!!!! dynamic_pointer_cast的使用
    RpcRequest::ptr rrp2 = std::dynamic_pointer_cast<RpcRequest>(bmp);
    std::cout << rrp2->method() << std::endl;
    std::cout << rrp2->params()["num1"] << std::endl;
    std::cout << rrp2->params()["num2"] << std::endl;

    return 0;
}

运行:

⭕ debug_1:dynamic_pointer_cast

📒dynamic_cast 和 dynamic_Pointer_cast的使用

1.指引或者引用的向上转换,向下转换

例如基类A ,派生类B.。A->B 则为向下转换。。B->A则为向上转换。。向上转换为隐士转换。向下转换需要dynamic_cast或者c的转换方式。

B * b = new B;

A * a = b;

此时b就是向上转换。无需显式转换既可以编译通过。

2.dynamic_cast

一般用于有继承关系的类之间的向下转换。

3.dynamic_pointer_cast

当指针是智能指针时候,向下转换,用dynamic_Cast 则编译不能通过,此时需要使用dynamic_pointer_cast。


TopicRequest测试

复制代码
int main()
{
 	TopicRequest::ptr trp = MessageFactory::create<TopicRequest>();
    trp->setTopicKey("news");
    trp->setOptype(TopicOptype::TOPIC_PUBLISH);
    trp->setTopicMsg("hello world");

    std::string str = trp->serialize();
    std::cout << str << std::endl;

    BaseMessage::ptr bmp = MessageFactory::create(MType::REQ_TOPIC);
    bmp->unserialize(str);

    bool ret = bmp->check();
    TopicRequest::ptr trp2 = std::dynamic_pointer_cast<TopicRequest>(bmp);
    std::cout << trp2->topicKey() << std::endl;
    std::cout << (int)trp2->optype() << std::endl;
    std::cout << trp2->topicMsg() << std::endl;

	return 0;
}

运行:


ServiceRequest测试

复制代码
int main()
{
	ServiceRequest::ptr trp = MessageFactory::create<ServiceRequest>();
    trp->setMethod("Add");
    trp->setOptype(ServiceOptype::SERVICE_REGISTRY);
//服务注册 测试

    trp->setHost(Address("127.0.0.1", 8080));
    
    std::string str = trp->serialize();
    std::cout << str << std::endl;

    BaseMessage::ptr bmp = MessageFactory::create(MType::REQ_SERVICE);
    bmp->unserialize(str);

    bool ret = bmp->check();
    ServiceRequest::ptr trp2 = std::dynamic_pointer_cast<ServiceRequest>(bmp);
    std::cout << trp2->method() << std::endl;
    std::cout << (int)trp2->optype() << std::endl;
    std::cout << trp2->host().first << std::endl;
    std::cout << trp2->host().second << std::endl;

	return 0;
}

⭕debug_2:gdb

调试:

使用 gdb

复制代码
(gdb) break message.hpp:169
run

gdb 调试中 不能使用宏 !!!!!!!!!!!!!!!!!!!!

后续采用 p 打印查看


Response

RpcResponse测试

复制代码
int main()
{
    RpcResponse::ptr trp = MessageFactory::create<RpcResponse>();
    trp->setRCode(RCode::RCODE_OK);
    trp->setResult(33);
    std::string str = trp->serialize();
    std::cout << str << std::endl;

    BaseMessage::ptr bmp = MessageFactory::create(MType::RSP_RPC);
    bmp->unserialize(str);

    bool ret = bmp->check();
    RpcResponse::ptr trp2 = std::dynamic_pointer_cast<RpcResponse>(bmp);
    std::cout << (int)trp2->rcode() << std::endl;
    std::cout << trp2->result().asInt() << std::endl;
	
	return 0;
}

运行:


TopicResponse测试

复制代码
int main()
{
	TopicResponse::ptr trp = MessageFactory::create<TopicResponse>();
    trp->setRCode(RCode::RCODE_OK);
    std::string str = trp->serialize();
    std::cout << str << std::endl;

    BaseMessage::ptr bmp = MessageFactory::create(MType::RSP_TOPIC);
    bmp->unserialize(str);

    bool ret = bmp->check();
    TopicResponse::ptr trp2 = std::dynamic_pointer_cast<TopicResponse>(bmp);
    std::cout << (int)trp2->rcode() << std::endl;
	
	return 0;
}

运行:


ServiceResponse测试

复制代码
int main()
{	
	ServiceResponse::ptr trp = MessageFactory::create<ServiceResponse>();
    trp->setRCode(RCode::RCODE_OK);
    trp->setMethod("Add");
    trp->setOptype(ServiceOptype::SERVICE_DISCOVERY);
    
    std::vector<Address> addrs;
    addrs.push_back(Address{"127.0.0.1", 8080});
    addrs.push_back(Address{"127.0.0.2", 9090});
    trp->setHost(addrs);
    std::string str = trp->serialize();
    std::cout << str << std::endl;

    BaseMessage::ptr bmp = MessageFactory::create(MType::RSP_SERVICE);
    bmp->unserialize(str);

    bool ret = bmp->check();
    ServiceResponse::ptr trp2 = std::dynamic_pointer_cast<ServiceResponse>(bmp);
    std::cout << (int)trp2->rcode() << std::endl;
    std::cout << trp2->method() << std::endl;
    std::cout << (int)trp2->optype() << std::endl;
    
    std::vector<Address> addrs1 = trp2->hosts();
    for(auto& addr : addrs1)
    {
        std::cout << addr.first << std::endl;
        std::cout << addr.second << std::endl;
    }

	return 0;
}

运行:

相关推荐
车载小杜1 小时前
基于指针的线程池
开发语言·c++
云 无 心 以 出 岫3 小时前
贪心算法QwQ
数据结构·c++·算法·贪心算法
换一颗红豆4 小时前
【C++ 多态】—— 礼器九鼎,釉下乾坤,多态中的 “风水寻龙诀“
c++
随便昵称4 小时前
蓝桥杯专项复习——前缀和和差分
c++·算法·前缀和·蓝桥杯
commonbelive4 小时前
团体程序设计天梯赛——L1-100 四项全能
c++
genispan4 小时前
QT/C++ 多线程并发下载实践
开发语言·c++·qt
小卡皮巴拉5 小时前
【力扣刷题实战】矩阵区域和
开发语言·c++·算法·leetcode·前缀和·矩阵
Pacify_The_North5 小时前
【C++进阶三】vector深度剖析(迭代器失效和深浅拷贝)
开发语言·c++·windows·visualstudio
神里流~霜灭5 小时前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
扫地的小何尚5 小时前
NVIDIA工业设施数字孪生中的机器人模拟
android·java·c++·链表·语言模型·机器人·gpu