init
This commit is contained in:
85
server/LogicServer/logicclient/CommonClient.cpp
Normal file
85
server/LogicServer/logicclient/CommonClient.cpp
Normal file
@@ -0,0 +1,85 @@
|
||||
#include "StdAfx.h"
|
||||
|
||||
using namespace jxSrvDef;
|
||||
|
||||
CCommonClient::CCommonClient()
|
||||
{
|
||||
SetClientName(_T("普通逻辑"));
|
||||
m_vFreeList.setLock(&m_vFreeListLock);
|
||||
}
|
||||
|
||||
CCommonClient::~CCommonClient()
|
||||
{
|
||||
m_vFreeList.flush();
|
||||
for (INT_PTR i = 0; i < m_vFreeList.count(); i++)
|
||||
{
|
||||
CDataPacket* dp = m_vFreeList[i];
|
||||
if(dp) {
|
||||
dp->setPosition(0);
|
||||
flushSendPacket(*dp);
|
||||
}
|
||||
}
|
||||
|
||||
m_vFreeList.clear();
|
||||
}
|
||||
|
||||
VOID CCommonClient::OnDispatchRecvPacket(const jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader &inPacket)
|
||||
{
|
||||
if (nCmd <= 0)
|
||||
{
|
||||
if(nCmd <0)
|
||||
{
|
||||
OutputMsg(rmWaning, _T("%s recv unknown msg[id=%d]"), __FUNCTION__, (int)nCmd);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
CDataPacket *outPacket = AllocSendPacket();
|
||||
if (!outPacket)
|
||||
{
|
||||
OutputMsg(rmError, _T("%s Alloc Packet Failed"), __FUNCTION__);
|
||||
return;
|
||||
}
|
||||
|
||||
outPacket->writeBuf(inPacket.getOffsetPtr(), inPacket.getAvaliableLength());
|
||||
GetGlobalLogicEngine()->GetNetWorkHandle()->PostInternalMessage(
|
||||
SSM_COMMONLOGIC_2_LOGIC_DATA, // 公共服务器 -> 逻辑服务器
|
||||
nCmd, // 消息ID
|
||||
(INT_PTR)outPacket); // 消息数据
|
||||
}
|
||||
|
||||
jxSrvDef::SERVERTYPE CCommonClient::getLocalServerType()
|
||||
{
|
||||
return jxSrvDef::GameServer;
|
||||
}
|
||||
|
||||
LPCSTR CCommonClient::getLocalServerName()
|
||||
{
|
||||
return GetLogicServer()->getServerName();
|
||||
}
|
||||
|
||||
int CCommonClient::getLocalServerIndex()
|
||||
{
|
||||
return GetLogicServer()->GetServerIndex();
|
||||
}
|
||||
|
||||
CDataPacket* CCommonClient::AllocSendPacket()
|
||||
{
|
||||
if (m_vFreeList.count() <= 0)
|
||||
{
|
||||
m_vFreeList.flush();
|
||||
}
|
||||
if (m_vFreeList.count() <= 0)
|
||||
{
|
||||
allocSendPacketList(m_vFreeList,512);
|
||||
}
|
||||
|
||||
CDataPacket* m_TempData = m_vFreeList.pop();
|
||||
m_TempData->setLength(0);
|
||||
return m_TempData;
|
||||
}
|
||||
|
||||
void CCommonClient::FreeBackUserDataPacket(CDataPacket *pPacket)
|
||||
{
|
||||
m_vFreeList.append(pPacket);
|
||||
}
|
||||
65
server/LogicServer/logicclient/CommonClient.h
Normal file
65
server/LogicServer/logicclient/CommonClient.h
Normal file
@@ -0,0 +1,65 @@
|
||||
#ifndef COMMON_CLIENT_H_
|
||||
#define COMMON_CLIENT_H_
|
||||
|
||||
/*
|
||||
此类实现了普通逻辑服务器连接公共逻辑服务器的客户端逻辑功能。普通逻辑服务器在引擎启动后创建此类对象,
|
||||
设置公共服务器地址信息并且连接到公共逻辑服务器。一旦建立到公共服务器的连接后,就可以发送和接受消息。
|
||||
发送消息给公共逻辑服务器:
|
||||
CDataPacket &packet = allocProtoPacket(nCmdId);
|
||||
// 填充消息数据包
|
||||
fluashProtoPacket(packet);
|
||||
引擎调用方式:
|
||||
CComClient *pCClient = GetGlobalEngine()->GetCommonClient();
|
||||
CDataPacket &packet = pCClient->allocProtoPacket(nCmdId);
|
||||
// 填充消息数据包
|
||||
pCClient->fluashProtoPacket(packet);
|
||||
|
||||
接受来自公共服务器的消息:
|
||||
OnDispatchRecvPacket接受消息并且将消息转发给NetWorkHandler里头,供逻辑线程处理。在NetWorkHandler
|
||||
类里头实现对应消息的派发处理即可。
|
||||
*/
|
||||
class CCommonClient : public CCustomJXClientSocket
|
||||
{
|
||||
public:
|
||||
typedef CCustomJXClientSocket Inherited;
|
||||
CCommonClient();
|
||||
virtual ~CCommonClient();
|
||||
|
||||
/*
|
||||
* Comments: 回收空闲的CDataPacket类
|
||||
* Param CDataPacket * pPacket:
|
||||
* @Return void:
|
||||
* @Remark: CommonClient收到来自CommonServer的数据包之后,本地分配数据包对象将内容缓存起来,然后通过逻辑线程处理。
|
||||
逻辑线程处理完数据后,调用此接口释放数据包对象。
|
||||
*/
|
||||
void FreeBackUserDataPacket(CDataPacket* pPacket);
|
||||
|
||||
protected:
|
||||
// 以下是实现基类的虚函数
|
||||
virtual VOID OnDispatchRecvPacket(const jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader &inPacket);
|
||||
|
||||
virtual jxSrvDef::SERVERTYPE getLocalServerType();
|
||||
|
||||
/* ★查询本地服务器的名称,以便正确的发送注册数据 */
|
||||
virtual LPCSTR getLocalServerName();
|
||||
/* ★查询本地服务器ID,以便正确的发送注册数据,默认的返回值是0 */
|
||||
virtual int getLocalServerIndex();
|
||||
|
||||
virtual void OnRountine()
|
||||
{
|
||||
CCustomJXClientSocket::OnRountine();
|
||||
}
|
||||
|
||||
/*
|
||||
* Comments: 分配数据包,用于存储接收到的数据
|
||||
* @Return CDataPacket*:
|
||||
* @Remark: 接收线程接收到数据并非立即处理,而是缓存起来,交给逻辑线程统一处理
|
||||
*/
|
||||
CDataPacket* AllocSendPacket();
|
||||
|
||||
private:
|
||||
CQueueList<CDataPacket*> m_vFreeList; //用来存放空闲的数据包
|
||||
CCSLock m_vFreeListLock;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user