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

测试源码:
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

猜你喜欢

转载自blog.csdn.net/zxng_work/article/details/78943265