RpcProvider发送Rpc服务一

OnMessage函数用于处理连接到服务端的请求,接收到的buffer数据通过protobuf进行反序列化为rpcreader类,从而得到服务类和服务方法的名字。

在此期间为了防止出现,粘包问题,在buffer中以此格式存放数据:"11helloworld4mess",通过读取前四个字节来获取头部的长度为11字节。然后取前11个字节的数据,进行反序列化得到相应的值。再根据序列化的值会得到4从而得到最后"mess"。

cpp 复制代码
void RpcProvider::OnMessage(const muduo::net::TcpConnectionPtr &conn, 
                            muduo::net::Buffer *buffer, 
                            muduo::Timestamp)
{
    // 网络上接收的远程rpc调用请求的字符流    Login args
    std::string recv_buf = buffer->retrieveAllAsString();

    // 从字符流中读取前4个字节的内容
    uint32_t header_size = 0;
    recv_buf.copy((char*)&header_size, 4, 0);

    // 根据header_size读取数据头的原始字符流,反序列化数据,得到rpc请求的详细信息
    std::string rpc_header_str = recv_buf.substr(4, header_size);
    mprpc::RpcHeader rpcHeader;
    std::string service_name;
    std::string method_name;
    uint32_t args_size;
    if (rpcHeader.ParseFromString(rpc_header_str))
    {
        // 数据头反序列化成功
        service_name = rpcHeader.service_name();
        method_name = rpcHeader.method_name();
        args_size = rpcHeader.args_size();
    }
    else
    {
        // 数据头反序列化失败
        std::cout << "rpc_header_str:" << rpc_header_str << " parse error!" << std::endl;
        return;
    }

    // 获取rpc方法参数的字符流数据
    std::string args_str = recv_buf.substr(4 + header_size, args_size);

    // 打印调试信息
    std::cout << "============================================" << std::endl;
    std::cout << "header_size: " << header_size << std::endl; 
    std::cout << "rpc_header_str: " << rpc_header_str << std::endl; 
    std::cout << "service_name: " << service_name << std::endl; 
    std::cout << "method_name: " << method_name << std::endl; 
    std::cout << "args_str: " << args_str << std::endl; 
    std::cout << "============================================" << std::endl;
相关推荐
无敌岩雀3 小时前
【计算机网络】TCP 协议——详解三次握手与四次挥手
网络·网络协议·tcp/ip·计算机网络
limengshi1383924 小时前
通信工程学习:什么是AN-SMF接入网系统管理功能
服务器·网络·网络协议·学习·信息与通信
小于负无穷5 小时前
Go 中 RPC 的使用教程
开发语言·后端·rpc·golang
knight-n5 小时前
详解HTTP/HTTPS协议
网络·网络协议·http·https
xiaoxiongip66612 小时前
代理IP的使用方法
网络·网络协议·tcp/ip
robin591114 小时前
centos下nvme over rdma 环境配置
linux·网络协议·云计算·nvme
溟洵16 小时前
查看TCP/UDP网络连接通信情况
网络协议·tcp/ip·udp
limengshi13839218 小时前
通信工程学习:什么是SNI业务节点接口
网络·网络协议·学习·信息与通信
alsknv18 小时前
只有IP地址没有域名怎么实现HTTPS访问?
网络·网络协议·tcp/ip·http·https·ssl
掘根20 小时前
【网络】高级IO——select版本TCP服务器
网络·数据库·网络协议·电脑