Python Tornado websocket处理程序self.close()正在关闭连接,而不触发on_close()方法
我是新来的(python,stackoverflow,tornado),所以请耐心点:)。纠正我 我在一个实时应用程序上使用tornado。当我在Websocket处理程序类中调用self.close()时,on_close方法没有启动,这次我做了一个小包装,修复了问题,并且(例如)正确地丢弃了连接的代理(纯avascript wss api客户端) 所有的网络问题都被丢弃了,因为我可怜的包装器工作得很好,而且我在局域网环境中 有人也有同样的问题吗?没有解释我睡不着 谢谢你,真的Python Tornado websocket处理程序self.close()正在关闭连接,而不触发on_close()方法,python,web,websocket,tornado,Python,Web,Websocket,Tornado,我是新来的(python,stackoverflow,tornado),所以请耐心点:)。纠正我 我在一个实时应用程序上使用tornado。当我在Websocket处理程序类中调用self.close()时,on_close方法没有启动,这次我做了一个小包装,修复了问题,并且(例如)正确地丢弃了连接的代理(纯avascript wss api客户端) 所有的网络问题都被丢弃了,因为我可怜的包装器工作得很好,而且我在局域网环境中 有人也有同样的问题吗?没有解释我睡不着 谢谢你,真的 ## impo
## imports and other stuff
AGENTS = set()
class BackofficeWSSRailMain(tornado.websocket.WebSocketHandler):
def on_open(self):
pass
def on_message(self,raw_message):
json_msg=json.loads(raw_message)
login = function_that_process_login(json_msg)
if login == True:
AGENTS.add(self)
self.write_message("ok")
else:
self.write_message("nologin")
self.close() ### this part should fireup
### the on_close method but nothing
### happens so AGENT is not discarded.
### here is when i actually call on_close_wrapper(),
### the method below.
def on_close_wrapper(self):
self.close() ### this is my actual solution ,
### waiting for more research.
self.on_close()
def on_close(self):
AGENTS.discard(self)
## Calling ioloop ...
self.on\u close
仅当客户端关闭其websocket连接端时才执行。试试看:如果你打开一个包含连接到你的服务器的Javascript客户端的网页,然后你关闭该网页,\u close上的将运行<如果在服务器代码中调用self.close
,则不应运行code>on\u close
你的包装是你问题的合理解决方案;也就是说,这是一种合理的方法,可以确保在调用
self.close
或客户端断开连接时运行相同的代码。如前所述,只有在客户端关闭连接时才会执行on_close()
,因此这是清理资源的好地方
对于任何清理,请使用此处记录的
on_finish()
方法Wow!我觉得自己像个傻瓜,非常感谢!!这正是我想听的。是的,我需要在这两种情况下执行相同的代码,因为这是一个“经过身份验证的websocket安全会话”,所以如果连接失败,客户端必须再次执行登录过程并重新获得一个新令牌。非常感谢你!!!祝你长寿!!!连接关闭()时的怎么样?在这两种情况下都会调用它,但只有当客户端关闭了\u close()
上的连接时才会调用。注意,您可能需要打开\u close()
查看此线程