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

Posted

技术标签:

【中文标题】完全停止线程龙卷风 WebSocket 服务器【英文标题】:Fullly stopping a threaded tornado WebSocket server 【发布时间】:2018-11-29 22:02:18 【问题描述】:

为了测试一个WebSocket客户端,我正在写一个小型的tornado 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 连接保持不变。 我怎样才能关闭所有已建立的连接?感谢您的帮助!

【问题讨论】:

【参考方案1】:

在 Tornado 5.1 中,没有简单的方法可以为 websocket 连接执行此操作(对于常规 HTTP,有 HTTPServer.close_all_connections)。您只需要跟踪所有连接并明确关闭它们。 Tornado 自己的测试套件跳过了许多难看的环节来完成这项工作,而不会向日志发送垃圾邮件并发出有关不正常关机的警告。

在 Tornado 6.0 中,我想解决这个问题,以便 HTTPServer.close_all_connections 知道 websocket 连接并关闭它们。

【讨论】:

感谢您的澄清。我将创建自己的连接列表,直到 HTTPServer.close_all_connections 完全了解所有 WebSocket 连接。感谢您的快速帮助以及提供和维护这个出色的框架。

以上是关于完全停止线程龙卷风 WebSocket 服务器的主要内容,如果未能解决你的问题,请参考以下文章

telnet 连接停止 websocket 服务器

在薄轨上安全地停止 em-websocket

龙卷风 websocket 服务器 - 连接队列

如何限制龙卷风 websocket 消息大小

如何响应龙卷风websocket中的服务器ping

WebSocket 在 Vue/Node 应用程序中停止工作