Advertisement

Google_Protobuf协议——Protobuf发送接收数据类型

阅读量:
  • 发送的数据为单个数据类型

    • 发送数据
    • 接收数据
  • 发送的数据为数组类型

    • 发送数据
    • 接收数据
  • 发送数据为消息体

    • 发送数据
    • 接收数据
  • 发送数据为消息体数组

    • 发送数据
    • 接收数据
  • 发送数据为引用外部proto消息体

    • 发送数据
    • 接收数据

测试源码:
https://github.com/zxworkSW/google_Protobuf_Test.git

发送的数据为单个数据类型

proto消息体定义

复制代码
    message TestSend {
    string  sname               = 1;
    uint32  u32number           = 2;
    bool    isSerializeArray    = 3;
    }
    
    
      
      
      
      
      
      
    

发送数据

复制代码
    bool CProtobuf::protosend(const std::string &name, int number)
    {
        if (name.empty())
            return false;
    
        prototest::TestSend sendmsg;
    
        sendmsg.set_sname(name);
        sendmsg.set_u32number(number);
        sendmsg.set_isserializearray(this->isSerializeToArray());
    
        return this->protobufsend(sendmsg);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

接收数据

复制代码
    bool CProtobuf::protoreceive()
    {
        prototest::TestSend getsand;
        prototest::TestReceive setresand;
        setresand.set_srename("reprotobuf");
    
        do
        {
            if (!protobufreceive(getsand))
            {
                setresand.set_enumcode(prototest::Recode::ERROR);
                break;
            }
    
            cout << "sendname = " << getsand.sname() << endl;
            cout << "number   = " << getsand.u32number() << endl;
            cout << "is array = " << getsand.isserializearray() << endl;
    
            setresand.set_enumcode(prototest::Recode::SUCCESS);
    
        } while (0);
    
        return this->protobufsend(setresand);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

执行结果

复制代码
    $ ./test.o 
    sendname    = String
    number      = 0
    is array    = 0
    re code     = 0
    re name     = reprotobuf
    
    
      
      
      
      
      
      
      
    

发送的数据为数组类型

proto消息体定义

复制代码
    message TestSendArray {
    string              sname           = 1;
    repeated uint32     u32number       = 2;
    repeated string     usernames_array = 3;
    }
    
    
      
      
      
      
      
      
    

发送数据

复制代码
    bool CProtobufArray::protosend(const std::string &name, std::vector<CUserinfo> &Users)
    {
        if (name.empty() || Users.empty())
            return true;
    
        prototest::TestSendArray sendmsg;
    
        sendmsg.set_sname(name);
    
        std::vector<CUserinfo>::iterator iter = Users.begin();
        while (iter != Users.end())
        {
            sendmsg.add_u32number(iter->get_number());
            sendmsg.add_usernames_array(iter->get_username());
            iter++;
        }
        sendmsg.add_usernames_array("end array");
    
        return this->protobufsend(sendmsg);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

接收数据

复制代码
    bool CProtobufArray::protoreceive()
    {
        prototest::TestSendArray getsand;
        prototest::TestReceive setresand;
        setresand.set_srename("reprotobuf");
        prototest::Recode revalue = prototest::Recode::ERROR;
    
        try
        {
            if (!protobufreceive(getsand))
                throw;
    
            cout << "sendname = " << getsand.sname() << endl;
    
            int numberlen = getsand.u32number_size();
            if (numberlen < 0)
                throw std::string("get u32number len is error!!!");
    
            for (int i = 0; i < numberlen; i++)
            {
                cout << "number   = " << getsand.u32number(i) << endl;
            }
    
            int nameslen = getsand.usernames_array_size();
            if (nameslen < 0)
                throw std::string("get usernames_array len is error!!!");
    
            for (int i = 0; i < nameslen; i++)
            {
                cout << "usersname   = " << getsand.usernames_array(i) << endl;
            }
    
            revalue = prototest::Recode::SUCCESS;
        }
        catch (const std::string &err_msg)
        {
            cout << err_msg << endl;
            revalue = prototest::Recode::ERROR;
        }
        catch (...)
        {
            cout << __FUNCTION__ << " is Error." << endl;
            revalue = prototest::Recode::ERROR;
        }
    
        setresand.set_enumcode(revalue);
        return this->protobufsend(setresand);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

执行结果

复制代码
    $ ./test.o 
    sendname = String
    number   = 4
    number   = 5
    number   = 6
    number   = 7
    number   = 8
    usersname   = userarray num4
    usersname   = userarray num5
    usersname   = userarray num6
    usersname   = userarray num7
    usersname   = userarray num8
    usersname   = end array
    re code  = 0
    re name  = reprotobuf
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

发送数据为消息体

proto消息体定义

复制代码
    message TestSendArray {
    string              sname               = 1;
    repeated uint32     u32number           = 2;
    repeated string     usernames_array     = 3;
    }
    
    message TestSendMsg {
    string          sMsg_name       = 1;
    TestSendArray   Msg_info        = 2;
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
    

发送数据

复制代码
    bool CProtobufMsg::protosend(const std::string &sendMsgname, 
                                 const std::string &sendArrayname,
                                 std::vector<CUserinfo> &Users)
    {
        if (sendMsgname.empty() || sendArrayname.empty() || Users.empty())
            return true;
    
        prototest::TestSendMsg sendmsg;
    
        sendmsg.set_smsg_name(sendMsgname);
        prototest::TestSendArray *send_msg = sendmsg.mutable_msg_info();
        if (!send_msg)
            return false;
    
        send_msg->set_sname(sendArrayname);
        std::vector<CUserinfo>::iterator iter = Users.begin();
        while (iter != Users.end())
        {
            send_msg->add_u32number(iter->get_number());
            send_msg->add_usernames_array(iter->get_username());
            iter++;
        }
        send_msg->add_usernames_array("end array");
    
        return this->protobufsend(sendmsg);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

接收数据

复制代码
    bool CProtobufMsg::protoreceive()
    {
        prototest::TestSendMsg getsand;
        prototest::TestReceive setresand;
        setresand.set_srename("reprotobuf");
        prototest::Recode revalue = prototest::Recode::ERROR;
    
        try
        {
            if (!protobufreceive(getsand))
                throw;
    
            cout << "sendMsgname = " << getsand.smsg_name() << endl;
    
            prototest::TestSendArray *send_msg = getsand.mutable_msg_info();
            if (!send_msg)
                throw std::string("get mutable_msg_info is error!!!");
    
            cout << "sendname = " << send_msg->sname() << endl;
            int numberlen = send_msg->u32number_size();
            if (numberlen < 0)
                throw std::string("get u32number len is error!!!");
    
            for (int i = 0; i < numberlen; i++)
            {
                cout << "number   = " << send_msg->u32number(i) << endl;
            }
    
            int nameslen = send_msg->usernames_array_size();
            if (nameslen < 0)
                throw std::string("get usernames_array len is error!!!");
    
            for (int i = 0; i < nameslen; i++)
            {
                cout << "usersname   = " << send_msg->usernames_array(i) << endl;
            }
    
            revalue = prototest::Recode::SUCCESS;
        }
        catch (const std::string &err_msg)
        {
            cout << err_msg << endl;
            revalue = prototest::Recode::ERROR;
        }
        catch (...)
        {
            cout << __FUNCTION__ << " is Error." << endl;
            revalue = prototest::Recode::ERROR;
        }
    
        setresand.set_enumcode(revalue);
        return this->protobufsend(setresand);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

执行结果

复制代码
    $ ./test.o 
    sendMsgname = MsgString
    sendname = String
    number   = 7
    number   = 8
    number   = 9
    number   = 10
    number   = 11
    usersname   = MsgString:7
    usersname   = MsgString:8
    usersname   = MsgString:9
    usersname   = MsgString:10
    usersname   = MsgString:11
    usersname   = end array
    re code  = 0
    re name  = reprotobuf
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

发送数据为消息体数组

proto消息体定义

复制代码
    message TestSendArray {
    string                   sname          = 1;
    repeated uint32         u32number       = 2;
    repeated string         usernames_array = 3;
    }
    
    message TestSendMsg {
    string                  sMsg_name       = 1;
    TestSendArray           Msg_info        = 2;
    }
    
    message TestSendArrayMsg {
    string                  sMsg_name       = 1;
    repeated TestSendArray  Msg_array       = 2;
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

发送数据

复制代码
    bool CProtobufArrayMsg::protosend(const std::string &sendMsgname, 
                                      const std::string &sendArrayname, 
                                      std::vector<std::vector<CUserinfo>> &MsgUsers)
    {
        if (sendMsgname.empty() || sendArrayname.empty() || MsgUsers.empty())
            return true;
    
        prototest::TestSendArrayMsg sendmsg;
    
        sendmsg.set_smsg_name(sendMsgname);
    
    
        std::vector<std::vector<CUserinfo>>::iterator msgiter = MsgUsers.begin();
        while (msgiter != MsgUsers.end())
        {
            prototest::TestSendArray *send_msg = sendmsg.add_msg_array();
            if (!send_msg)
                return false;
            static int i = 6;
            send_msg->set_sname(sendArrayname + std::to_string(i));
            i++;
            std::vector<CUserinfo>::iterator iter = msgiter->begin();
            while (iter != msgiter->end())
            {
                send_msg->add_u32number(iter->get_number());
                send_msg->add_usernames_array(iter->get_username());
                iter++;
            }
            send_msg->add_usernames_array("end array");
            msgiter++;
        }
    
        return this->protobufsend(sendmsg);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

接收数据

复制代码
    bool CProtobufArrayMsg::protoreceive()
    {
        prototest::TestSendArrayMsg getsand;
        prototest::TestReceive setresand;
        setresand.set_srename("reprotobuf");
        prototest::Recode revalue = prototest::Recode::ERROR;
    
        try
        {
            if (!protobufreceive(getsand))
                throw;
    
            cout << "sendMsgname = " << getsand.smsg_name() << endl;
    
            int msg_array_size = getsand.msg_array_size();
            if (msg_array_size < 0)
                throw std::string("get msg_array_size len is error!!!");
    
            for (int i = 0; i < msg_array_size; i++)
            {
                prototest::TestSendArray get_msgarray = getsand.msg_array(i);
    
                cout << "sendname = " << get_msgarray.sname() << endl;
                int numberlen = get_msgarray.u32number_size();
                if (numberlen < 0)
                    throw std::string("get u32number len is error!!!");
    
                for (int i = 0; i < numberlen; i++)
                {
                    cout << "number   = " << get_msgarray.u32number(i) << endl;
                }
    
                int nameslen = get_msgarray.usernames_array_size();
                if (nameslen < 0)
                    throw std::string("get usernames_array len is error!!!");
    
                for (int i = 0; i < nameslen; i++)
                {
                    cout << "usersname   = " << get_msgarray.usernames_array(i) << endl;
                }
    
            }
    
            revalue = prototest::Recode::SUCCESS;
        }
        catch (const std::string &err_msg)
        {
            cout << err_msg << endl;
            revalue = prototest::Recode::ERROR;
        }
        catch (...)
        {
            cout << __FUNCTION__ << " is Error." << endl;
            revalue = prototest::Recode::ERROR;
        }
    
        setresand.set_enumcode(revalue);
        return this->protobufsend(setresand);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

执行结果

复制代码
    $ ./test.o 
    sendMsgname = MsgString
    sendname = String6
    number   = 4
    number   = 6
    number   = 8
    number   = 10
    number   = 12
    usersname   = userarray num 4
    usersname   = userarray num 6
    usersname   = userarray num 8
    usersname   = userarray num 10
    usersname   = userarray num 12
    usersname   = end array
    sendname = String7
    number   = 5
    number   = 7
    number   = 9
    number   = 11
    number   = 13
    usersname   = userarray num 5
    usersname   = userarray num 7
    usersname   = userarray num 9
    usersname   = userarray num 11
    usersname   = userarray num 13
    usersname   = end array
    sendname = String8
    number   = 6
    number   = 8
    number   = 10
    number   = 12
    number   = 14
    usersname   = userarray num 6
    usersname   = userarray num 8
    usersname   = userarray num 10
    usersname   = userarray num 12
    usersname   = userarray num 14
    usersname   = end array
    sendname = String9
    number   = 7
    number   = 9
    number   = 11
    number   = 13
    number   = 15
    usersname   = userarray num 7
    usersname   = userarray num 9
    usersname   = userarray num 11
    usersname   = userarray num 13
    usersname   = userarray num 15
    usersname   = end array
    sendname = String10
    number   = 8
    number   = 10
    number   = 12
    number   = 14
    number   = 16
    usersname   = userarray num 8
    usersname   = userarray num 10
    usersname   = userarray num 12
    usersname   = userarray num 14
    usersname   = userarray num 16
    usersname   = end array
    re code  = 0
    re name  = reprotobuf
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

发送数据为引用外部proto消息体

proto消息体定义

复制代码
    message TestImport {
    string                  sImport_name    = 1;
    zxtest.user.UserInfo    userinfo        = 2;
    zxtest.log.SendLog      Log             = 3;
    }
    
    
      
      
      
      
      
      
    

发送数据

复制代码
    bool CProtobufImport::protosend(const std::string &name, 
                                    CUserinfo &user_info, 
                                    const std::string &log_info)
    {
        if (name.empty() || log_info.empty())
            return false;
    
        prototest::TestImport sendmsg;
    
        sendmsg.set_simport_name(name);
        user::UserInfo *send_user = sendmsg.mutable_userinfo();
        if (!send_user)
            return false;
    
        send_user->set_index(user_info.get_number());
        send_user->set_username(user_info.get_username());
    
        log::SendLog *send_log = sendmsg.mutable_log();
        if (!send_log)
            return false;
    
        send_log->set_sname(name);
        send_log->set_log(log_info);
        send_log->set_scode(log::Recode::SUCCESS);
    
        return this->protobufsend(sendmsg);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

接收数据

复制代码
    bool CProtobufImport::protoreceive()
    {
        prototest::TestImport getsand;
        prototest::TestReceive setresand;
        setresand.set_srename("reprotobuf");
        prototest::Recode revalue = prototest::Recode::ERROR;
    
        try
        {
            if (!protobufreceive(getsand))
                throw;
    
            cout << "sendname = " << getsand.simport_name() << endl;
    
            user::UserInfo *get_user = getsand.mutable_userinfo();
            if (!get_user)
                throw std::string("get user info is error!!!");
    
            cout << "user index = " << get_user->index() << endl;
            cout << "user name = " << get_user->username() << endl;
    
            log::SendLog *get_log = getsand.mutable_log();
            if (!get_log)
                throw std::string("get log info is error!!!");
    
            cout << "log sand name = " << get_log->sname() << endl;
            cout << "log  = " << get_log->log() << endl;
            cout << "log  code = " << get_log->scode() << endl;
    
            revalue = prototest::Recode::SUCCESS;
    
        }
        catch (const std::string &err_msg)
        {
            cout << err_msg << endl;
            revalue = prototest::Recode::ERROR;
        }
        catch (...)
        {
            cout << __FUNCTION__ << " is Error." << endl;
            revalue = prototest::Recode::ERROR;
        }
    
        setresand.set_enumcode(revalue);
        return this->protobufsend(setresand);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

执行结果

复制代码
    $ ./test.o 
    sendname = String
    user index = 13
    user name = TestUser
    log sand name = String
    log  = LogTest
    log  code = 0
    re code  = 0
    re name  = reprotobuf
    
    
      
      
      
      
      
      
      
      
      
      
    

全部评论 (0)

还没有任何评论哟~