Полная остановка сервера WebSocket с торнадо - PullRequest
0 голосов
/ 30 ноября 2018

Для тестирования клиента 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 остаются нетронутыми.Как я могу закрыть все установленные соединения?Спасибо за помощь!

1 Ответ

0 голосов
/ 30 ноября 2018

В Tornado 5.1 нет простого способа сделать это для соединений через веб-сокеты (для обычного HTTP есть HTTPServer.close_all_connections).Вам просто нужно будет отслеживать все ваши соединения и явно закрывать их.Собственный набор тестов Tornado перепрыгивает через множество уродливых обручей, чтобы сделать эту работу без спама в журналах с предупреждениями о нечистом завершении работы.

В Tornado 6.0 я хочу исправить это так, чтобы HTTPServer.close_all_connections знал о соединениях веб-сокетов изакрывает их тоже.

...