繁体   English   中英

完全停止线程化龙卷风WebSocket服务器

[英]Fullly stopping a threaded tornado WebSocket server

为了测试WebSocket客户端,我正在编写小型龙卷风WebSocket服务器,该服务器驻留在指定的线程中,并且可以在测试运行时期间启动和停止。 到目前为止,这是我想出的:

class SocketHandler(tornado.websocket.WebSocketHandler):
    def __init__(self, application, request, **kwargs):
        super().__init__(application, request, **kwargs)
        self.authenticated = False

    def check_origin(self, origin):
        return True

    def open(self):
        pass

    def on_message(self, message):
        pass

    def on_close(self):
        pass


application = tornado.web.Application([
    (r"/ws", SocketHandler),
])

class WebSocketServer(threading.Thread):
    def __init__(self, port):
        threading.Thread.__init__(self, name='WebServer')
        self.port = port
        self.ioloop = None

    def run(self):
        self.ioloop = tornado.ioloop.IOLoop()

        http_server_api = tornado.httpserver.HTTPServer(application)
        http_server_api.listen(self.port)

        self.ioloop.start()

        http_server_api.stop()
        self.ioloop.clear_instance()

    def stop(self):
        self.ioloop.add_callback(self.ioloop.stop)

启动服务器运行良好:

server = WebSocketServer(8888)
server.start()  

我可以使用任何WebSocket客户端连接服务器。 不幸的是,当我停止服务器时:

server.stop()

线程关闭,服务器的侦听端口被删除,但是所有已建立的WebSocket连接保持不变。 如何关闭所有已建立的连接? 谢谢您的帮助!

在Tornado 5.1中,没有简单的方法可以对websocket连接进行此操作(对于常规HTTP,则具有HTTPServer.close_all_connections)。 您只需要跟踪所有连接并显式关闭它们即可。 Tornado自己的测试套件会跳过很多丑陋的循环,从而在不向日志发送垃圾邮件警告不洁关机的情况下使此工作变得很困难。

在Tornado 6.0中,我想修复此问题,以便HTTPServer.close_all_connections知道websocket连接并也将其关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM