【问题标题】:How to automatically close connection serverside after a certain time in Tornado Websocket如何在 Tornado Websocket 中一段时间​​后自动关闭连接服务器端
【发布时间】:2015-07-08 10:21:44
【问题描述】:

我有一个 Tornado Websocket 服务器,它有一个打开的连接字典:

class WebSocketHandler(tornado.websocket.WebSocketHandler):
    def open(self, *args):
        self.id = self.generate_id()
        self.stream.set_nodelay(True)

        # ... DO STUFF ...

        clients[self.id] = {"id": self.id, "time":datetime.now(), "object": self}
        self.write_message("Connection SUCCESSFUL! Thanks for connecting! Your connection ID is: %d :)" % self.id)
        print datetime.now()
        print "New connection. ID: %d" % self.id
        print "Total number of open connections: %d" % len(clients)

    def on_close(self):
        print datetime.now()
        print "Closing connection %d." % self.id 
        if self.id in clients:
            del clients[self.id]
        print "Number of open connections: %d" % len(clients)

我想自动关闭所有超过一小时的连接。所以是这样的:

for client in clients.values():
    if (datetime.now() - client["time"])>timedelta(minutes=60):
        client["object"].close()

但我不知道我应该把这个检查放在哪里并关闭旧连接。

【问题讨论】:

    标签: python websocket tornado


    【解决方案1】:

    详情请咨询this answer

    import tornado
    import datetime
    class WebSocketHandler(tornado.websocket.WebSocketHandler):
        def open(self, *args):
            self.id = self.generate_id()
            self.stream.set_nodelay(True)
            self.timeout = tornado.ioloop.IOLoop.current().add_timeout(
                datetime.timedelta(minutes=60), self.explicit_close)
    
            # ... DO STUFF ...
    
            clients[self.id] = {"id": self.id, "time":datetime.now(), "object": self}
            self.write_message("Connection SUCCESSFUL! Thanks for connecting! Your connection ID is: %d :)" % self.id)
            print datetime.now()
            print "New connection. ID: %d" % self.id
            print "Total number of open connections: %d" % len(clients)
    
        def on_close(self):
            print datetime.now()
            print "Closing connection %d." % self.id 
            if self.id in clients:
                del clients[self.id]
            print "Number of open connections: %d" % len(clients)
    
        def explicit_close(self):
            self.close() # you wont even have to iterate over the clients.
    

    关注龙卷风的IOLoopreference question就很容易理解了。

    【讨论】:

    • 谢谢!看起来很棒。我会测试它并告诉你结果。
    • @bisounours_tronconneuse 当然...还要检查我提到的链接...它有详细的讨论
    • 所以我实现了它,但它不能正常工作。我对这个问题提出了另一个问题(即连接没有在应该关闭的时候关闭):stackoverflow.com/questions/31424881/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2015-11-11
    • 2013-04-20
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多