/******************************************************************** file name : ServerType.h author : Clark/陈泽丹 created : 2011-12-20 网游网络通讯经常采用中心服模型: 读: 用户消息->代理服数据->用户端 写: 用户消息->中心服数据->更新代理服数据->用户端 以下类用于把"没有同步机制的类型"转成"中心服和代理服有同步机制的类型" 1, 采用模板继承是为了能使用源类型的内部功能(没有用组合的原因) 2, 留三个虚函数是为了客户端可以添加相应的指令和其解析功能。 使用时,只对外留下Send接口,用户不需解决Send到那和那里接收的问题 对源类型要求有拷贝构造函数。 *********************************************************************/ #pragma once int GetLogicServerID() { return 105; } template<class T> class ServerType: protected T { public: ServerType(const int _CUR_SERVER_ID, const T& _other): CUR_SERVER_ID(_CUR_SERVER_ID), T(_other){} void Send(const int _CmdID, char* _buf) { if( CUR_SERVER_ID == GetLogicServerID()){ OnLogicRecv(_CmdID, _buf); } else{ SendToLogic(_CmdID, _buf); } } const int CUR_SERVER_ID; protected: void SendToProxy(const int _CmdID, char* _buf){ API_SendTo_ProxyServer(_CmdID, _buf); } virtual void SendToLogic(const int _CmdID, char* _buf){ API_SendTo_LogicServer(_CmdID, _buf); } private: void Recv(const int _CmdID, char* _buf) { if( CUR_SERVER_ID == GetLogicServerID()){ OnLogicRecv(_CmdID, _buf); } else{ OnProxyRecv(_CmdID, _buf); } } friend void API_SendTo_LogicServer(const int _CmdID, char* _buf); friend void API_SendTo_ProxyServer(const int _CmdID, char* _buf); virtual void OnLogicRecv(const int _CmdID, char* _buf) = 0; virtual void OnProxyRecv(const int _CmdID, char* _buf) = 0; };
//test
#include <iostream> #include "ServerType.h" using namespace std; class SourceType { public: SourceType(int _i1, int _i2):m_val1(_i1),m_val2(_i2){} SourceType(const SourceType& _other){ m_val1 = _other.m_val1; m_val2 = _other.m_val2; } void Show(){ cout<<this->m_val1<<" "<<this->m_val2<<endl; } int m_val1; int m_val2; }; class ZcFb:public ServerType<SourceType> { public: ZcFb(const int _CUR_SERVER_ID, const SourceType& _data): ServerType<SourceType>(_CUR_SERVER_ID, _data){} void OnLogicRecv(const int _CmdID, char* _buf) { this->m_val1 = _CmdID; this->m_val2 = *((int*)_buf); cout<<"逻辑服内容"<<endl; this->Show(); SendToProxy(_CmdID, (char*)this); } void OnProxyRecv(const int _CmdID, char* _buf) { ZcFb* pZcFb = (ZcFb*)_buf; this->m_val1 = pZcFb->m_val1; this->m_val2 = pZcFb->m_val2; cout<<"代理服内容"<<endl; this->Show(); } }; ServerType<SourceType>* pServerLogic = NULL; ServerType<SourceType>* pServerProxy1 = NULL; ServerType<SourceType>* pServerProxy2 = NULL; void API_SendTo_LogicServer(const int _CmdID, char* _buf) { pServerLogic->Recv(_CmdID, _buf); } void API_SendTo_ProxyServer(const int _CmdID, char* _buf) { pServerProxy1->Recv(_CmdID, _buf); pServerProxy2->Recv(_CmdID, _buf); } void InitLogic() { SourceType objLogic(1,1); pServerLogic = new ZcFb(105, objLogic); } void InitProxy() { SourceType objProxy(2,2); pServerProxy1 = new ZcFb(99, objProxy); pServerProxy2 = new ZcFb(100, objProxy); } void Over() { if( NULL != pServerLogic) delete pServerLogic; if( NULL != pServerProxy1) delete pServerProxy1; if( NULL != pServerProxy2) delete pServerProxy2; } void main() { InitLogic(); InitProxy(); int it = 1; pServerLogic->Send(1,(char*)&it); it = 2; pServerProxy1->Send(2,(char*)&it); it = 3; pServerProxy2->Send(3,(char*)&it); system("pause"); }