Skip to content

消息收发与广播

消息收发与广播

1 消息的收发处理

没有交互的客户端和服务器就像是隔河相望的男女,只可远观,却永远擦不出火花;消息的收发处理就像那男女沟通的桥梁,是客户端和服务器碰撞的介质。但服务器的具体操作我们应该怎么处理呢?听我一一道来:

1.1消息介绍

首先介绍一下一条消息的组成成分: 每一条消息(不管是接收的还是发送)的组成都有名称和数据两部分组成。
:当然有时数据部分可为空,视情况而定。 例如:

//坐下请求
massage RoomSitDownRoomCmd_C 
    {
optional uint32 seatID=1;//座位id
 }
massage RoomSitDownRoomCmd_S 
    {
optional uint32 resultCode=1;//返回码
optional string desc=2;//描述
 }

其中,massage RoomSitDownRoomCmd_C与massage RoomSitDownRoomCmd_S为消息名称;optional uint32 seatID,optional uint32 resultCode与optional string desc为数据。

1.2代码中的具体操作

具体的收发操作我们一般是将它放置于msg*.lua文件中来操作的。

Net.CmdRoomSitDownRoomCmd_C=function(cmd,laccount)
 local res={}
 res["do"]="Cmd.RoomSitDownRoomCmd_S"
 local uid=laccount.Id
 local roomId=RoomMgr.CmdRoomIdGetByUid(uid)
 if roomId==0 then
  res["data"]={
    resultCode=1,
   desc="玩房不存在",
 }
return res
end

①接收消息

 Net.CmdRoomEnterRoomCmd_C=function(cmd,laccount)

cmd:存储接收到的数据。
laccount:存储着客户端发送方的相关信息。
注意Net.CmdRoomEnterRoomCmd_C和消息名称RoomEnterRoomCmd_C的区别。 接收到消息后首先应根据具体的需求对数据进行判断其是否合法:
:根据需求可有可无。

local res={}
 res["do"]="Cmd.RoomEnterRoomCmd_S"
 if cmd.data==nil or cmd.data.subGameID==nil then
 res["data"]={
  resultCode=1,
  desc="参数不够",
}
return res
end

判断其如果不合法则提前终止,返回错误信息给客户端。

②发送消息
如上所示,发送前必须定义一个table来存储消息名称段和数据段。
res["do"]="Cmd.RoomEnterRoomCmd_S" 消息名称段
res["data"]={ resultCode=1, desc="参数不够", } 数据段
最后通过return res发送给客户端。 切记上述操作必须放置于msg**.lua文件中操作。 如果有特殊情况必须置于其他文件操作可用下述方式:

③特殊处理:
发送处理:res的存储方式与内容不变,其发送方式采取如下操作:

local laccount=go.roomusermgr.GarRoomUserById(uid)
unilight.success(laccount,res)

接收处理:任何文件中都可以这样使用,但是为了规范性建议置于msg***.lua中。

Net.CmdRoomEnterRoomCmd_C=function(cmd,laccount)

2 广播操作

2.1广播含义

  • 广播:向所有人发送(群聊)
  • 单播:一对一发送(私聊)
    广播和单播的区别就像是群聊和私聊的区别,广播和单播的组成成分跟消息相同都是由名称和数据两个字段组成。

2.2代码操作 代码操作中,必须指定广播的名称和数据。

--跟注广播
function CmdFollowChipsRoomCmd\_Brd(roomInfo,roomId,intervalTime,uid)
 local doInfo="Cmd.FollowChipsRoomCmd_Brd"
 local data={
 intervalTime=intervalTime,
 nextSeatId=roomInfo.index
}
RoomMgr.CmdMsgBrd(doInfo,data,roomId)
end

--开奖广播
function CmdLotteryRoomCmd\_Brd(uid,intervalTime,userLottery,isWinFlag,lotteryInfo)
 local doInfo="Cmd.LotteryRoomCmd_Brd"
 local data={
 intervalTime=intervalTime,
 userLottery=userLottery,
 isWinFlag=isWinFlag,
 lotteryInfo=lotteryInfo,
}
RoomMgr.CmdCheckMsgMe(uid,doInfo,data)
end


发送方式: 广播和单播发送方式的唯一区别就是指定的对象不同:一个为整个游戏房间,一个为单独玩家。

--检查给自己发送消息
function CmdCheckMsgMe(uid,doInfo,data)
 if CmdCheckUserInRoom(uid)==true then
  chesstcplib.TcpMsgSendToMe(uid,doInfo,data)
 end
end
--广播--
--广播包装
function CmdMsgBrd(doInfo,data,roomId)
 local roomInfo=MapRoom[roomId]
 if roomInfo.BrdRoom ~=nil then
 chesstcplib.TcpRoomInfoBrd(roomInfo.BrdRoom,doinfo,data)
 end
end