gpt4 book ai didi

python - 如何在 Tornado 中随意发送 websocket 消息?

转载 作者:太空狗 更新时间:2023-10-29 23:58:28 26 4
gpt4 key购买 nike

我是 Tornado 的新手,想知道是否可以从我的 Python 程序中随意向所有客户端发送消息 (write_message)?例如,假设我的程序正在监视目录以查看文件是否出现/存在。当它出现时,我想向浏览器客户端发送一条网络套接字消息,表明该文件存在。我似乎无法理解如何在不首先收到 websocket 消息(on_message 处理程序)的情况下调用“write_message”方法。

即使我使用“PeriodicCallback”方法,我仍然不清楚我实际上是如何调用“write_message”方法的。是否有任何示例说明如何在不在“on_message”处理程序中调用“write_message”?

最佳答案

您需要保留一个已打开的 websocket 的集合,并随意遍历该集合以发送消息。

举个例子,我会在客户端连接到 your.domain.example/test/ 的任何时候发送一条消息,但只要你想发送一些东西,想法都是一样的:

import os.path
import logging

from tornado import ioloop, web, websocket


SERVER_FOLDER = os.path.abspath(os.path.dirname(__file__))
LOGGER = logging.getLogger('tornado.application')


class TestHandler(web.RequestHandler):
def get(self):
server = ioloop.IOLoop.current()
data = "whatever"
server.add_callback(DefaultWebSocket.send_message, data)
self.set_status(200)
self.finish()


class DefaultWebSocket(websocket.WebSocketHandler):
live_web_sockets = set()

def open(self):
LOGGER.debug("WebSocket opened")
self.set_nodelay(True)
self.live_web_sockets.add(self)
self.write_message("you've been connected. Congratz.")

def on_message(self, message):
LOGGER.debug('Message incomming: %s', message)

def on_close(self):
LOGGER.debug("WebSocket closed")

@classmethod
def send_message(cls, message):
removable = set()
for ws in cls.live_web_sockets:
if not ws.ws_connection or not ws.ws_connection.stream.socket:
removable.add(ws)
else:
ws.write_message(message)
for ws in removable:
cls.live_web_sockets.remove(ws)


def serve_forever(port=80, address=''):
application = web.Application([
(r"/test/", TestHandler),
(r"/websocket/", DefaultWebSocket),
...
],
static_path=os.path.join(SERVER_FOLDER, ...),
debug=True,
)
application.listen(port, address)
LOGGER.debug(
'Server listening at http://%s:%d/',
address or 'localhost', port)
ioloop.IOLoop.current().start()


if __name__ == "__main__":
serve_forever()

您显然需要使用以下 JavaScript 在浏览器中创建一个 websocket:

socket = new WebSocket('ws://your.domain.example:80/websocket/');

并进行相应的管理。

关于python - 如何在 Tornado 中随意发送 websocket 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32445705/

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