Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tornado websocket处理程序self.close()正在关闭连接,而不触发on_close()方法_Python_Web_Websocket_Tornado - Fatal编程技术网

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

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

我是新来的(python,stackoverflow,tornado),所以请耐心点:)。纠正我

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

所有的网络问题都被丢弃了,因为我可怜的包装器工作得很好,而且我在局域网环境中

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

谢谢你,真的

## 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()
查看此线程