• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

客户端与服务器通信

开发技术 开发技术 3小时前 2次浏览

客户端:

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

 


程序员灯塔
转载请注明原文链接:客户端与服务器通信
喜欢 (0)