消息收发与广播
消息收发与广播
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