游戏服务器之场景和网关之间的消息同步

本文介绍了游戏服务器中场景服务器与网关服务器间的消息同步,包括单个玩家和多玩家的消息发送,重点阐述了广播发送的实现。场景服务器发送带有屏索引和角色ID的消息到网关,网关通过索引实现单播和九屏广播。调试信息显示,网关在IO线程中处理并转发消息,减少了锁的使用。
摘要由CSDN通过智能技术生成

场景和网关之间同步消息,再同步到客户端(单播、广播)。

设计上:

网关上有角色id为索引的网关玩家。可以作为单播的依据。

网关上有屏索引的玩家集合,可以作为九屏广播的依据。

场景上的屏索引和网关上的屏索引上的玩家是实时同步的。场景发送消息到网关会附带屏索引和角色id。


1、场景服务器与网关服务器的转发消息

场景服务器发送消息到网关服务器,网关服务器查找对应网关玩家,并发送消息。

(1)单个玩家的消息发送

stSendplayerCmdToMeForwardServerCmd *revMsg = (stSendplayerCmdToMeForwardServerCmd *)ptrMsg;
gateway_player *pplayer = g_user_mgr.get_player_by_id(revMsg->charid);//获取网关玩家
if(pplayer)
{
	pplayer->sendmsgToMe(revMsg->data, revMsg->datasize());//转发消息给玩家
}
 
//网关玩家发送消息
bool gateway_player::sendmsgToMe(const void *ptrmsg, const int msglen)
{
	//检查消息长度
	if((uint32)msglen >= tcp_socket::MAX_USERDATASIZE || msglen == 0)
	{
		const MSG::base_msg *ptrMsg = (MSG::base_msg *)ptrmsg;
		g_log->error("%s发送消息长度不合法[%u,%u],大小:%u",this->name.c_str(), ptrMsg->first,ptrMsg->second,msglen);
		return false;
	}
	using namespace MSG;
	base_msg *pCmd = (base_msg *)ptrmsg;
	if(gatewaytask) 
	{
		if(passivetask)//转发给客户端
		{
			passivetask->sendmsg(ptrmsg,msglen);
		}
		if(!this->wait_peeper)
		{
			//场景发来的消息是通过网关连接gatewaytask来发送的&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值