2012-09-17 47 views
4

我一直在寻找相当长一段时间的解决方案,但没有骰子。如何通知Python/Tornado客户已关闭标签页/浏览器?

编辑:我没有指出我正在尝试创建一个聊天服务器。所以人们登录后,他们的ID会被追加到userslisteners列表中。他们开始聊天。但是,当他们中的一个试图关闭标签或浏览器,用户将永远不会从这两个列表中删除,所以他/她保持登录状态。

编辑2:我认为上面的编号有点混乱,所以我发布了脚本中的部分以及底部。

到目前为止,我已经试过on_connection_close()函数(不曾经被解雇,我不知道为什么),该on_finish()函数(被解雇每次当finish()被调用时),因此没有按也不符合法案。

现在,我想出了一个解决方案的一点点其中涉及on_finish()功能:

  1. 每当UpdateHandlerpost()函数被调用,然后self.done = 0设置。
  2. 就在finish()函数被解雇之前,我设置了self.done = 1。现在
  3. on_finish()函数被调用,我打印到控制台self.done和它的1
  4. 同样on_finish()功能我做了一个IFself.done = 1声明,如预期它返回TRUE和龙卷风的io_loop.add_timeout与参数time.time()+3(使它会休眠3秒钟,以确定用户是否导航到网站内的其他页面或完全离开网站)以及最终将被调用的回调。
  5. 秒3我想检查是否self.done仍然等于1或之后,如果用户仍然在网站上,然后果然将是0

顺便说一句,每30秒服务器完成的连接,然后向用户发送通知以启动新的连接,以便连接永远不会超时。 当客户端关闭浏览器并且30秒超时超时时,服务器会尝试发送通知,如果客户端仍在我的网站上,那么它会启动一个新的连接,从而调用上面提到的UpdateHandler类中的post()函数因此,设置变量self.done回0(这就是为什么我给io_loop.add_timeout 3秒的裕量。)

现在,该是采取照顾,我想继续前进,尝试,看看它是如何工作的。 我启动了服务器,并打开浏览器导航到正确的URL并观察服务器如何响应(通过在脚本中放置几个​​print语句)。当用户保持连接状态时,我可以看到在post()调用后(显示当时显示为self.done = 0)它睡了3秒钟,然后回调函数被调用,但是这个打印self.done = 1这很奇怪。

我知道这不是最有效的方法,但它是我能想出的唯一解决方案,它甚至没有像预期的那样工作。

结论:

我希望有人在我的理论,我错过了打破了整个事情的一个很好的替代或者甚至一个点。 我真的很想知道如何让Tornado知道客户端关闭浏览器而不用等待30秒的超时完成。 也许用ping命令打开连接或什么的。我对TORNADIO进行了一点调查,但并不喜欢那么多。如果可能的话,我想在纯粹的龙卷风中做到这一点。

我会尽快提交代码,我一直在尝试像半小时看'如何格式'等,但当我尝试提交我的编辑它会给出一个错误。

  • 您的帖子似乎包含的代码未正确格式化为 代码。请使用代码工具栏 按钮或CTRL + K键盘快捷键将所有代码缩进4个空格。要获得更多编辑帮助,请单击[?]工具栏图标 。
+0

为什么你不喜欢tornadio,你想达到什么目的? –

+0

由于tornadio使用websockets,据我所知,哪些浏览器(主要是旧的)不支持,我不喜欢它的主要原因是它也使用flash,我不知道什么是精确的,但我从来不想在我的网站上使用闪光灯来播放视频播放器以外的任何内容。 正如我在上面的帖子中所说的,我想在客户关闭他/她的浏览器时通知Tornado,以便我可以将用户注销。就这样。 – gblblgl

+0

你可以在tornadio禁止使用flash和webscokets。然后你会准备好使用协议,它支持已经关闭的连接事件。不要做新的自行车。顺便说一句,你可以看看tornadio代码,看看它如何关闭连接。 –

回答

0

我一直有这个问题像5 - 6天,最后发现问题是什么,以及..不完全是实际但它解决了!我一直在网上搜索,但一无所获。我在上面的帖子中说过,几个月前我尝试使用同一个脚本时,我确实记得它的工作原理,但我从未提及过当时使用nginx。我一直在努力与Apache + mod_proxy,但我不知道apache是什么问题,但是当我试着nginx这次又一次它工作!

如果您有同样的问题(on_connection_close未被触发)“TRY”nginx。感谢您的帮助@尼科莱。

0

on_close()方法tornado.websocket.WebSocketHandler用于处理选项卡/浏览器关闭事件。这里是一个例子:

from tornado.websocket import WebSocketHandler 

class MyWebsocketHandler(WebSocketHandler): 
    ... 

    def on_close(self): 
     self.application.database.abort() 

reference页面。

相关问题