客户端与服务器通信

客户端:

发送和接收数据包都在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 );
}

 

客户端与服务器通信

上一篇:MySQL数据备份与还原


下一篇:atcoder arc123 C题 1, 2, 3 - Decomposition