Как передать сообщение клиентам сокета торнадо сразу? - PullRequest
0 голосов
/ 04 февраля 2020

Я запускаю приложение торнадо, но я понял, что каждый раз, когда появляется новое соединение с сокетом, оно создает новый экземпляр сервера вместо добавления нового соединения в self.connections. Из-за этого поведения я не могу передать сообщение всем соединениям одновременно. Как я могу заставить приложение работать, используя существующий экземпляр?

import asyncio
import tornado.ioloop
import tornado.web
import tornado.websocket
import tornado.wsgi
import time


class EchoWebSocket(tornado.websocket.WebSocketHandler):

    def initialize(self, tornado_output_queue):
        self.connections = set()

    def open(self):
        print("WebSocket opened")
        self.connections.add(self)

    def on_message(self, message):
        for client in self.connections:
            await client.write_message(str(time.time()))

    def on_close(self):
        print("WebSocket closed")

    def check_origin(self, origin):
        return True


def make_app():
    "initializes the web server"
    return tornado.web.Application([
        (r"/websocket", EchoWebSocket)
    ])


if __name__ == "__main__":
    webapp = make_app()
    application = tornado.wsgi.WSGIContainer(webapp)
    webapp.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Я прочитал о tornado.ioloop.IOLoop.current Vs tornado.ioloop.IOLoop.instance (который я использую), но в документах говорится, что .instance это просто псевдоним .current.

1 Ответ

1 голос
/ 04 февраля 2020

Tornado создает новый экземпляр обработчика для каждого соединения. Для отслеживания всех подключенных клиентов необходимо создать объект connections в классе:

class EchoWebSocket(...):
    connections = set()
...