CHeartBeat是一种短连接,由于游戏不是时时性的,不需要太过一直连接,所以采取短连接的机制,cheartBeat
在刚刚登陆的时候,
ngHttpClient::HandleUpdate(int32 deltaMS)
{
ParseResponse(timestamp, pHash->Get("data"));
}
向服务器发请求时间戳到了,接收请求,
case ReqHeartBeat:
{CFunGame::GetInstance()->ParseHeartBeat(pData);
break;
}
ParseHeartBeat中
void CFunGame::ParseHeartBeat(void* pData) {
if (pData == NULL ) return;
if (!m_heartBeat.IsStarted()) { //游戏就开始了心跳处理
return;
}
m_player.ParseHeartBeart(pData); //cplayer的parseHeartBeat 更新player中的数据
}
一个心跳的时间是30s,也就是每隔30会向服务器发送请求,来更新玩家信息,以此来实现游戏短连接
其中,CHeartBeat中有虚函数OnReceiveResponse 对某个界面设置监听之后,将这个类加入CHeartBeatListener监听中去,这样,在每次心跳刷新时,就可以调用到这个函数,在被监听的页面也可以时时更新自己想要在这个页面也想要更新的数据,以此来让玩家感觉这是在时时更新的。
停止心跳的地方:
退出游戏
游戏reuse 弹出的时候
玩家账号被封了
问题:cfungame中是如何parseheartbeat
CHeartBeat中,当一个心跳结束的时候,会SendHeartBeat();
在此函数中 CHTTPCLIENT->RequestHeartBeat(m_lastHeartBeat);
int32 CHttpClient::RequestHeartBeat(int64 timestamp)
{
m_reqType = ReqHeartBeat;ngJsonHash *pHash = DNEW ngJsonHash();
pHash->Set("playerId", PLAYERID);
pHash->Set("timestamp", timestamp); //时间戳就是向服务器发送上一次心跳结束的时间
pHash->Set("messageId", PLAYER->GetlastMailId());
pHash->Set("bulletinId", PLAYER->GetLastBulletinId());));
}
----