我一直在寻找相关的解决方案,但没有骰子。
编辑:我没有指出我正在尝试制作聊天服务器。因此,当用户登录时,他们的ID会附加到users
和listeners
列表中。他们开始聊天。但当其中一个人试图关闭标签或浏览器时,用户永远不会从两个列表中删除,因此他/她保持登录状态。
Edit2:我认为上面的编号有点令人困惑所以我在底部也发布了部分内容。
到目前为止,我已经尝试了on_connection_close()函数(它不会被触发,我不知道为什么),on_finish()
函数(每次{{1}时都被触发)被称为)所以也不适合该法案。
现在我想出了一个涉及finish()
功能的解决方案:
on_finish()
类UpdateHandler
函数时,都会设置post()
。self.done = 0
函数被触发之前,我设置了finish()
。self.done = 1
函数,我在控制台上打印on_finish()
,它就是1. self.done
函数中,我执行on_finish()
IF
语句,按预期返回self.done = 1
和Tornado的TRUE
参数{{1} (这样它会睡3秒钟以确保用户导航到网站内的其他页面或完全离开网站)以及最终将要调用的回调。io_loop.add_timeout
是否仍然等于1,或者如果用户仍然在网站上,那么确定它将为0。顺便说一句,服务器每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
,但不喜欢那么多。如果可能的话,我想在纯龙卷风中做到这一点。
我会尽快提交代码,我已经尝试了半个小时看“如何格式化”等等但是当我尝试提交我的编辑时会出错。
答案 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页。