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