Tornado websocket 处理程序,self.close() 正在关闭连接而不触发 on_close() 方法

Posted

技术标签:

【中文标题】Tornado websocket 处理程序,self.close() 正在关闭连接而不触发 on_close() 方法【英文标题】:Tornado websocket handler , self.close() is closing connection without triggering the on_close() method 【发布时间】:2014-01-14 18:44:12 【问题描述】:

我是 (python, ***, tornado) 的新手,所以请耐心等待 :)。纠正我。

我正在使用 Tornado 开发一个实时应用程序。当我在 Websocket 处理程序类中调用 self.close() 时,on_close 方法没有启动,这次我做了一个小包装,修复了问题并(例如)丢弃了连接的代理(纯 avascript wss api 客户端)正确。

所有网络问题都被丢弃了,因为我可怜的包装器运行良好并且我在 LAN 环境中。

有人有同样的问题吗?没有解释我睡不着。

谢谢你,真的。

## imports and other stuff 

AGENTS = set()     

class BackofficeWs-s-railMain(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 ...

【问题讨论】:

【参考方案1】:

self.on_close 当且仅当客户端关闭其一侧的 websocket 连接时才会执行。试试看:如果您打开一个包含连接到服务器的 javascript 客户端的网页,然后关闭该页面,on_close 将运行。如果您在服务器代码中调用 self.closeon_close 不应该运行。

您的包装器是您问题的合理解决方案;也就是说,当您调用self.close 或客户端断开连接时,这是一种确保相同代码运行的合理方法。

【讨论】:

哇!我觉得自己像个菜鸟,非常感谢!这正是我想听到的。是的,我需要在这两种情况下执行相同的代码,因为是“经过身份验证的 websocket 安全会话”,所以如果连接失败,客户端必须再次执行登录过程并重新获取新令牌。非常感谢你 !!! *** 寿命长!!! on_connection_close() link 怎么样?在这两种情况下都会调用它,但只有在客户端关闭连接时才会调用on_close()【参考方案2】:

如前所述,on_close() 仅在客户端关闭连接时才会执行,因此它是清理资源的好地方。

对于任何清理,请使用此处记录的on_finish() 方法https://tornado.readthedocs.org/en/latest/web.html#tornado.web.RequestHandler.on_finish

【讨论】:

注意,你可能需要on_connection_close() 看到这个线程github.com/tornadoweb/tornado/issues/517

以上是关于Tornado websocket 处理程序,self.close() 正在关闭连接而不触发 on_close() 方法的主要内容,如果未能解决你的问题,请参考以下文章

Tornado websocket 处理程序,self.close() 正在关闭连接而不触发 on_close() 方法

在 Tornado 中保留 websocket 连接列表 [重复]

如何在 Tornado 中创建多个 websocket 聊天?

websocket[tornado] 的单个实例可以处理不同的请求吗?

WebSocket Handler on_close 方法 async 实现tornado

Tornado——异步,websocket