gpt4 book ai didi

python - 未收到 Tornado websocket 消息

转载 作者:行者123 更新时间:2023-12-01 01:48:31 26 4
gpt4 key购买 nike

受这个问题的启发,我有一个非常简单的设置:Tornado - Listen to multiple clients simultaneously over websockets

本质上,我有一个 Websocket 处理程序,可以连接到许多 Websocket 客户端。然后我有另一个 websocket 处理程序“DataHandler”,每次收到消息时都会广播一条消息。

因此,我创建了 TestHandler 实例的全局列表,并使用它向所有实例广播消息

ws_clients = []

class TestHandler(tornado.websocket.WebSocketHandler):
def open(self):
print('open test!')
ws_clients.append(self)
self.random_number = random.randint(0, 101)

def on_message(self, message):
print(message)

print('received', message, self, self.random_number)
self.write_message('Message received')

def on_close(self):
print('closed')


class DataHandler(tornado.websocket.WebSocketHandler):
def open(self):
print('data open!')

def on_message(self, message):
for c in ws_clients:
c.write_message('hello!')


class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"/test_service/", TestHandler),
(r"/data/", DataHandler),
(r"/", httpHandler)
]

tornado.web.Application.__init__(self, handlers)


ws_app = Application()
ws_app.listen(8000)
tornado.ioloop.IOLoop.instance().start()

TestHandler可以通过地址ws://127.0.0.1/test_service/接收消息,DataHandler可以通过地址ws://127.0.0.1/data/接收消息 但每当我循环访问 ws_clients 时,我都不会在 TestHandler 上收到任何消息。

我做错了什么吗?

最佳答案

这就是我要做的 - 我会在 TestHandler 上创建一个新方法来服务一个目的 - 获取一条消息并将其发送给所有连接的客户端。

在进入代码之前,我想指出,(通常)将 ws_clients 保留在类中而不是全局对象中似乎更好。并使用 set 而不是 list

class TestHandler(...):
ws_clients = set() # use set instead of list to avoid duplicate connections

def open(self):
self.ws_clients.add(self)

@classmethod
def broadcast(cls, message):
"""Takes a message and sends to all connected clients"""
for client in cls.ws_clients:
# here you can calculate `var` depending on each client
client.write_message(message)

def on_close(self):
# remove the client from `ws_clients`
self.ws_client.remove(self)


# then you can call TestHandler.broadcast
# from anywhere in your code
# example:

class DataHandler(...):
...

def on_message(self, message):
# pass the message to TestHandler
# to send out to connected clients
TestHandler.broadcast(message)

关于python - 未收到 Tornado websocket 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50982203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com