用protobuf定义消息及处理
来源:互联网 发布:淘宝哪家情侣装好看 编辑:程序博客网 时间:2024/05/23 11:14
用protobuf定义消息及处理
(金庆的专栏)
消息定义:
package MsgPb;
message Msg {
required string type = 1; // Full type name of data.
required bytes data = 2; // Serialized bytes fo concrete msg.
}
消息发送代码:
void MsgSender::Send(const std::string & sDest, const MsgPb::Msg & msg)
{
std::string s;
bool bSuc = msg.SerializeToString(&s);
BOOST_ASSERT(bSuc);
Send(sDest, s);
}
void MsgSender::Send(const std::string & sDest,
const google::protobuf::Message & msg) const
{
MsgPb::Msg msgSend;
msgSend.set_type(msg.GetTypeName());
bool bSuc = msg.SerializeToString(msgSend.mutable_data());
BOOST_ASSERT(bSuc);
Send(sDest, msgSend);
}
消息接收后分发:
void HandleOneMsg(const string & sFrom, const string & sMsg)
{
MsgPb::Msg msg;
bool bSuc = msg.ParseFromString(sMsg);
if (!bSuc) return;
MsgDispatcher::Dispatch(sFrom, msg);
}
void MsgDispatcher::Dispatch(const string & sFrom, const MsgPb::Msg & msg)
{
HandlerMap::const_iterator itr = s_mapHandlers.find(msg.type());
if (itr == s_mapHandler.end()) return;
MsgPb::GoogleMsgPtr pMsg = MsgPb::ParseMsg(msg.type(), msg.data());
if (pMsg)
(*itr).second(sFrom, *pMsg);
}
消息解析:
typedef google::protobuf::Message GoogleMsg;
typedef boost::shared_ptr<GoogleMsg> GoogleMsgPtr;
// ParseMsg.cpp
#include "ParseMsg.h"
#include <google/protobuf/descriptor.h>
#include <googlt/protobuf/message.h>
namespace {
using MsgPb::GoogleMsgPtr;
GoogleMsgPtr GreateMsg(const string & sTypeName)
{
using namespace google::protobuf;
const Descriptor * pDescriptor = DescriptorPool::generated_pool();
->FindMessageTypeByName(sTypeName);
if (NULL == pDescriptor)
return GoogleMsgPtr();
const Message * pPrototype = MessageFcatory::generated_factory();
->GetPrototype(pDescriptor);
if (NULL == pPrototype)
return GoogleMsgPtr();
return GoogleMsgPtr(pPrototype->New());
}
} // namespace
namespace MsgPb {
GoogleMsgPtr ParseMsg(const string & sTypeName, const string & sData)
{
GoogleMsgPtr pMsg = CreateMsg(sTypeName);
if (!pMsg) return GoogleMsgPtr();
bool bSuc = pMsg->ParseFromString(sData);
if (bSuc) return pMsg;
return GoogleMsgPtr();
}
} // namespce MsgPb
注册处理器:
void MsgDispatcher::Init()
{
using namespace MsgPb;
InsertHandler(LobbyRegisterMsg(), LobbyRegisterMsgHandler());
InsertHandler(LoginMsg(), LoginMsgHandler());
...
}
void MsgDispatcher::InsertHandler(const MsgPb::GoogleMsg & msg,
const MsgHandler & h)
{
s_mapHandlers[msg.GetTypeName()] = h;
}
MsgPb::LoginMsg是个具体的消息。MsgPb::Msg是个消息封装。
(金庆的专栏)
消息定义:
package MsgPb;
message Msg {
required string type = 1; // Full type name of data.
required bytes data = 2; // Serialized bytes fo concrete msg.
}
消息发送代码:
void MsgSender::Send(const std::string & sDest, const MsgPb::Msg & msg)
{
std::string s;
bool bSuc = msg.SerializeToString(&s);
BOOST_ASSERT(bSuc);
Send(sDest, s);
}
void MsgSender::Send(const std::string & sDest,
const google::protobuf::Message & msg) const
{
MsgPb::Msg msgSend;
msgSend.set_type(msg.GetTypeName());
bool bSuc = msg.SerializeToString(msgSend.mutable_data());
BOOST_ASSERT(bSuc);
Send(sDest, msgSend);
}
消息接收后分发:
void HandleOneMsg(const string & sFrom, const string & sMsg)
{
MsgPb::Msg msg;
bool bSuc = msg.ParseFromString(sMsg);
if (!bSuc) return;
MsgDispatcher::Dispatch(sFrom, msg);
}
void MsgDispatcher::Dispatch(const string & sFrom, const MsgPb::Msg & msg)
{
HandlerMap::const_iterator itr = s_mapHandlers.find(msg.type());
if (itr == s_mapHandler.end()) return;
MsgPb::GoogleMsgPtr pMsg = MsgPb::ParseMsg(msg.type(), msg.data());
if (pMsg)
(*itr).second(sFrom, *pMsg);
}
消息解析:
typedef google::protobuf::Message GoogleMsg;
typedef boost::shared_ptr<GoogleMsg> GoogleMsgPtr;
// ParseMsg.cpp
#include "ParseMsg.h"
#include <google/protobuf/descriptor.h>
#include <googlt/protobuf/message.h>
namespace {
using MsgPb::GoogleMsgPtr;
GoogleMsgPtr GreateMsg(const string & sTypeName)
{
using namespace google::protobuf;
const Descriptor * pDescriptor = DescriptorPool::generated_pool();
->FindMessageTypeByName(sTypeName);
if (NULL == pDescriptor)
return GoogleMsgPtr();
const Message * pPrototype = MessageFcatory::generated_factory();
->GetPrototype(pDescriptor);
if (NULL == pPrototype)
return GoogleMsgPtr();
return GoogleMsgPtr(pPrototype->New());
}
} // namespace
namespace MsgPb {
GoogleMsgPtr ParseMsg(const string & sTypeName, const string & sData)
{
GoogleMsgPtr pMsg = CreateMsg(sTypeName);
if (!pMsg) return GoogleMsgPtr();
bool bSuc = pMsg->ParseFromString(sData);
if (bSuc) return pMsg;
return GoogleMsgPtr();
}
} // namespce MsgPb
注册处理器:
void MsgDispatcher::Init()
{
using namespace MsgPb;
InsertHandler(LobbyRegisterMsg(), LobbyRegisterMsgHandler());
InsertHandler(LoginMsg(), LoginMsgHandler());
...
}
void MsgDispatcher::InsertHandler(const MsgPb::GoogleMsg & msg,
const MsgHandler & h)
{
s_mapHandlers[msg.GetTypeName()] = h;
}
MsgPb::LoginMsg是个具体的消息。MsgPb::Msg是个消息封装。
它们都是google::protobuf::Message的子类。
转自:http://blog.csdn.net/jq0123/article/details/7824168
0 0
- 用protobuf定义消息及处理
- 用protobuf定义消息及处理
- protobuf用Extensions定义消息方法
- 使用protobuf定义消息
- 使用protobuf定义消息
- [ProtoBuf]定义ProtocolBuffer消息
- protobuf extensions(extend)的消息定义及Java使用方法
- protobuf定义低带宽的移动消息
- 基于netty的项目中使用protobuf,巧妙定义proto完成不同消息的编码和解码处理
- 基于netty的项目中使用protobuf,巧妙定义proto完成不同消息的编码和解码处理 .
- signal定义及处理
- 消息及异步处理
- 灵活定义和处理SOAP头消息
- 灵活定义和处理SOAP头消息
- vc 添加消息及消息处理函数
- Protobuf数据定义
- protobuf中的数据类型定义
- Protobuf消息格式
- bzoj 1283(线性规划)
- HDU 2586 How far away ? 离线LCA
- ListView常用技巧及优化
- uva 10902 Pick-up Sticks
- 虚拟机的网络连接
- 用protobuf定义消息及处理
- 美团面试总结
- Java中的反射机制复习
- 【BZOJ4597】【Shoi2016】随机序列 线段树
- redis简介
- 343. Integer Break
- [leetcode] 239. Sliding Window Maximum
- Box2d源码学习<十二>b2Collision之碰撞(上)公共部分的实现
- [整体二分 || 树套树 || 点分治] BZOJ 4009 [HNOI2015]接水果