页游手游服务器(三)lua网络层
在(一)中,介绍了c对lua层的拓展,这边主要写lua层的网络部分,目标是实现RPC调用,实现主要是三部分:
1通信协议(消息的序列化和反序列化)
rpc调用主要信息包括方法名,方法参数,设计的通信协议如下:
字节长度(4字节)|方法名|方法参数
因为方法参数是由1个表序列化来的,必然以’{‘开头,所以可以区分方法名和方法参数.
local data=_encodefuncname, funcarg)
local funcname, funcarg=_decode(data)
以上两个方法分别对应消息的序列化,反序列化
实际使用可以优化,怎么优化可以自己想想(主要优化相同的长字符串)
2发送消息
发送消息主要是对单个连接(net)发送和广播。举例,对某个玩家告诉他的vip升级了,形式如下:
player.vip{lv=8}
还需要对所有的在线用户广播XXX升级到了vip8,形式如下:
World.vip{Player='XXX', lv=8}
实现主要是借助lua的metatable,核心的相关代码如下:
_callout(PLAYER, function(player,func, args)
local data=_encode(func, args)
net:send(#data+4), net:send(data)
end)
_callout(WORLD, function(world, func, args)
local data=_encode(func, args)
for _, net in nets do
net:send(#data+4), net:send(data)
end
end)
其中player的metatable是PLAYERworld的metatable是WORLD,核心方法是_callout,可以参考callout.lua
3接收消息
从网络接收到了消息之后,不是立即处理,而且是把它放在一个队列里面,等网络循环完了,再处理消息,原因可以自己想下
一般使用如下:
_callin(net, data)
_callin 实现思路如下:
queue.push({net, _decode(data)})
消息的处理借助lua实现的1个事件机制,事件机制是真个服务器实现中最精彩的部分,下一篇详细介绍