如何通知Python / Tornado客户端已关闭标签/浏览器?

时间:2012-09-17 21:15:10

标签: python connection chat tornado

我一直在寻找相关的解决方案,但没有骰子。

编辑:我没有指出我正在尝试制作聊天服务器。因此,当用户登录时,他们的ID会附加到userslisteners列表中。他们开始聊天。但当其中一个人试图关闭标签或浏览器时,用户永远不会从两个列表中删除,因此他/她保持登录状态。

Edit2:我认为上面的编号有点令人困惑所以我在底部也发布了部分内容。

到目前为止,我已经尝试了on_connection_close()函数(它不会被触发,我不知道为什么),on_finish()函数(每次{{1}时都被触发)被称为)所以也不适合该法案。

现在我想出了一个涉及finish()功能的解决方案:

  1. 每当调用on_finish()UpdateHandler函数时,都会设置post()
  2. self.done = 0函数被触发之前,我设置了finish()
  3. 现在调用了self.done = 1函数,我在控制台上打印on_finish(),它就是1.
  4. 在相同的self.done函数中,我执行on_finish() IF语句,按预期返回self.done = 1和Tornado的TRUE参数{{1} (这样它会睡3秒钟以确保用户导航到网站内的其他页面或完全离开网站)以及最终将要调用的回调。
  5. 3秒后,我想检查io_loop.add_timeout是否仍然等于1,或者如果用户仍然在网站上,那么确定它将为0。
  6. 顺便说一句,服务器每30秒完成一次连接,然后向用户发送通知以启动新连接,以便连接永远不会超时。 当客户端关闭浏览器并且30秒长超时到期时,服务器尝试发送通知,如果客户端仍在我的网站上,那么它将启动新连接,从而在UpdateHandler类中调用time.time()+3函数我在上面提到过,因此将变量self.done设置回0.(这就是为什么我给post()一个3秒的余量。)

    现在我已经注意到了,我想继续尝试看看它是如何工作的。 我启动了服务器,打开了一个导航到右侧URL的浏览器,并观察了服务器如何响应(通过在脚本中放置一些self.done语句)。当用户保持连接时,我可以看到在post()调用之后(当时显示io_loop.add_timeout)它会休眠3秒,然后调用回调函数,但是这个函数会打印print很奇怪。

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

    结论:

    我希望有人有一个很好的选择,或者甚至是我的理论中的一点,我错过了打破整个事情。 我真的想知道如何让Tornado知道客户端关闭浏览器而不等待30秒的超时完成。 也许ping ping开放连接或其他东西。我稍微调查了self.done = 0,但不喜欢那么多。如果可能的话,我想在纯龙卷风中做到这一点。

    我会尽快提交代码,我已经尝试了半个小时看“如何格式化”等等但是当我尝试提交我的编辑时会出错。

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

2 个答案:

答案 0 :(得分:0)

我已经有这样的问题了5到6天,终于找到了问题所在,好吧......实际上并不完全,但它已经解决了!我一直在互联网上搜索,但一无所获。我在上面的帖子中告诉我,几个月前我尝试使用相同的脚本时,我确实记得它正在工作,但我从未提及当时使用nginx。我一直在努力使用Apache + mod_proxy,但我不知道apache的问题是什么,但是当我再次尝试nginx时它才起作用!

如果你有同样的问题(on_connection_close没有被解雇)“TRY”nginx。谢谢你的帮助@Nikolay。

答案 1 :(得分:0)

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

from tornado.websocket import WebSocketHandler

class MyWebsocketHandler(WebSocketHandler):
    ...

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

reference页。