本文以作者做过的一个tornado框架开发的游戏为例说明(代码仅供参考)。
在游戏中判断玩家是否断线一般有以下判断思路:
heartbeat = 30
1、实现一个计划任务,里面有回调函数和间隔时间。作用是每隔一定的时间,服务端会自动执行这个回调函数。
PeriodicCallback(SessionMgr().heartbeat, 1000*heartbeat).start()
使用tornado ioloop的PeriodicCallback实现计划任务。ioloop的PeriodicCallback源码 , PeriodicCallback构造函数可以接收三个参数,一个是回调的函数,一个是间隔的时间,还有一个是io_loop, 一般io_loop为None就可以了,后面会调用当前的IO_LOOP。
2、在每次服务端接收到客户端的新消息时,记录当前连接时间 last_time。
def on_message(self, buf):
self.last_time = time.time()
from protocol.deserialize import receive
receive(buf, self)
tornado框架中,on_message方法:连接收到新消息时被调用。
3、服务端调用回调函数是,记录当前时间 now_time。设置一个定值作为离线时间判断,比如60s。进行判断:now_time - last_time>60s,即该用户已经离线。
def heartbeat(self):
now = time.time()
# p