python - 如何一次向 Tornado 套接字客户端广播消息?

标签 python sockets websocket tornado python-asyncio

我正在运行一个 Tornado 应用程序,但我意识到每次套接字有一个新连接时,它都会创建服务器的新实例,而不是将新连接添加到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.currenttornado.ioloop.IOLoop.instance(我正在使用),但是文档说.instance只是.current的别名。

最佳答案

Tornado 为每个连接创建处理程序的新实例。要跟踪所有已连接的客户端,您必须在类上创建connections对象:

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

关于python - 如何一次向 Tornado 套接字客户端广播消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60058778/

相关文章:

javascript - WebSocket 的 Webaudio 播放出现中断

android - Android 上的 SSL 客户端

javascript - Web 套接字项目删除约定

python - 获取矩形opencv python的中心

python - 使用shutil移动文件时出错

python使用函数的结果来决定是否应该使用函数结果

返回输出前在后台运行的 Python 子进程

python - python中socket.PF_PACKET和socket.AF_INET的区别

python - 在 Python 中将以太网数据与 ARP 协议(protocol)一起发送到汽车网关

javascript - 这个 websocket 结果的哪一部分是二进制 protobuf 数据?