如何在 Tornado Websocket 一段时间后自动关闭连接服务器端 [英] How to automatically close connection serverside after a certain time in Tornado Websocket

查看:45
本文介绍了如何在 Tornado Websocket 一段时间后自动关闭连接服务器端的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

class WebSocketHandler(tornado.websocket.WebSocketHandler):def open(self, *args):self.id = self.generate_id()self.stream.set_nodelay(真)# ... 做东西 ...客户[self.id] = {"id": self.id, "time":datetime.now(), "object": self}self.write_message("连接成功!感谢连接!您的连接 ID 是:%d :)" % self.id)打印 datetime.now()打印新连接.ID:%d"% self.id打印打开的连接总数:%d"% len(clients)def on_close(self):打印 datetime.now()打印正在关闭连接 %d."% self.id如果 self.id 在客户端:德尔客户[self.id]打印打开的连接数:%d"% len(clients)

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

 用于clients.values() 中的客户端:if (datetime.now() - client["time"])>timedelta(minutes=60):客户端[对象"].close()

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

解决方案

请参考这个答案 进一步说明

导入龙卷风导入日期时间类 WebSocketHandler(tornado.websocket.WebSocketHandler):def open(self, *args):self.id = self.generate_id()self.stream.set_nodelay(真)self.timeout = tornado.ioloop.IOLoop.current().add_timeout(datetime.timedelta(minutes=60), self.explicit_close)# ... 做东西 ...客户[self.id] = {"id": self.id, "time":datetime.now(), "object": self}self.write_message("连接成功!感谢连接!您的连接 ID 是:%d :)" % self.id)打印 datetime.now()打印新连接.ID:%d"% self.id打印打开的连接总数:%d"% len(clients)def on_close(self):打印 datetime.now()打印正在关闭连接 %d."% self.id如果 self.id 在客户端:德尔客户[self.id]打印打开的连接数:%d"% len(clients)defexplicit_close(self):self.close() # 你甚至不必遍历客户端.

<块引用>

遵循龙卷风的IOLoop参考问题 很容易理解.

I have a Tornado Websocket server which has a dictionary of open connections:

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)

I would like to do automatically close all connections which are more than one hour old. So something like this:

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

But I don't know where I should put this check and closing old connections.

解决方案

Please refer to this answer for further clarification

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.

Follow the IOLoop of tornado and reference question it will be easy to understand.

这篇关于如何在 Tornado Websocket 一段时间后自动关闭连接服务器端的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆