« 计划给 skynet 增加短连接的支持 | 返回首页 | 给 skynet 增加 http 服务器模块 »

skynet 消息服务器支持

周末终于把上周提到的 短连接服务 实现了。由于本质上是一个消息请求回应模式的服务器,并没有局限于长连接还是短连接,所以不打算用短连接服务来命名。

用户的登陆状态不再依赖于是否有连接保持,所以登陆服务也顺理成章的分离出来了。

用户先去统一的登陆服务器登陆,获得令牌,然后去游戏服务器连接握手。如果用户和游戏服务器的连接断开,只需要重新用令牌握手即可,不必重新回登陆服务器登陆。

当然用户也可以重新登陆,清除登陆状态,完成一个传统意义上的下线再上线的过程。

和常规的 HTTP 协议不同,我们可以在同一条连接上发起多个请求,服务器也不必按次序回应它们。每个请求有一个 session ,用来匹配请求包和回应包。

由于是基于 session 的模式,所以可以轻易的实现原本觉得比较麻烦的服务器向客户端的消息推送:

只需要建立连接后,马上向服务器发一个请求,索取服务器可能推送的数据即可。如果服务器暂时没有推送需求,可以挂起这个 session ;直到有消息推送时,再以这个 session 回应即可。客户端收到回应后,立刻发送新的请求,重复这个过程。若是担心这样效率比较低,可以一次发送多个请求,服务器依次使用即可。

对于多次连接间丢消息这件事,每次新建立连接,可以把上次没有得到回应的包重新发送出去,session 保持不变;服务器收到重复的 session 且不是当前连接过去发来的,只需要把 cache 的回应包重发回去。如果 cache 失效,简单的踢掉用户,要求它重新走一次登出登陆流程即可。


使用写好的 msg server,业务层仅需要写一个 lua 函数处理请求。不用关心连接这件事。这个 lua 函数处理传入的请求串,返回一个回应串即可。

细节和范例可见我在 skynet wiki 上写了三篇主要的文档:

登陆服务器 网关服务器 消息服务器

Comments

希望skynet能跨win平台啊,虽然有同学自己做了,但是最好是官方支持

Post a comment

非这个主题相关的留言请到:留言本