客户端:
发送和接收数据包都在CPacketHandler类中进行处理的。
class CPacketHandler : public xSingleton<CPacketHandler> { public: CPacketHandler(); virtual ~CPacketHandler(); public: void Tick(); void ParseCGAttack( IDL::CG::CGAttack* packetObject );
bool ProcessPacket( cpp::net::PacketObject* packetObject ); }
xsingleton类是一个模板类,主要是为了让子类具有单例属性。
服务器发给客户端的消息都是由ProcessPacket()函数接收,然后分发给具体的消息处理函数。
处理思路:
ProcessPacket()接收到参数后,采用if elseif else 的方式,与各个子类的实例指针进行比较,如果相等,则调用该子类的处理函数。
为了代码简洁,实现了两个宏,分别为:
#define ParsePacketObject( compare1, compare2 ) if( compare1->factoryObject() == compare2::Factory::instance() ) Parse##compare2( static_cast<compare2*>(compare1) ) #define ParsePacketObjectElse( compare1, compare2 ) else if( compare1->factoryObject() == compare2::Factory::instance() ) Parse##compare2( static_cast<compare2*>(compare1) )
ProcessPacket函数的具体实现就变成了(不会出现大量的if elseif......):
bool CPacketHandler::ProcessPacket(cpp::net::PacketObject* packetObject ) { ParsePacketObject( packetObject, CGERRORMSG ); ParsePacketObjectElse( packetObject, CGCharacterReConnectAck ); ParsePacketObjectElse( packetObject, CGMyInfo ); ParsePacketObjectElse( packetObject, CGNPCMove ); ParsePacketObjectElse( packetObject, CGUserAlter ); }