【问题标题】:Do ping-pong at regular interval using Tornado websocket使用 Tornado websocket 定期打乒乓球
【发布时间】:2018-05-12 00:26:08
【问题描述】:

我是 python 中的 Tornado 服务器的新手,并尝试定期对连接的客户端进行 ping-pong。 我在 tornado 文档中看到了一个名为 websocket_ping_interval 的东西,但找不到任何关于如何/何时使用它的示例。

我使用ioloop.PeriodicCallback 执行了以下操作,但似乎没有执行任何 ping 操作。

import tornado.web
from tornado import ioloop
from terminado import TermSocket, SingleTermManager
from tornado import websocket


# BaseWebSocketHandler removed, because we need to track all opened
# sockets in the class. You could change this later.
class MeterInfo(websocket.WebSocketHandler):
    """Establish an websocket connection and send meter readings."""
    opened_sockets = []
    previous_meter_reading = 0

    def open(self):
        self.write_message('Connection Established.')
        MeterInfo.opened_sockets.append(self)

    def on_close(self):
        """Close the connection."""
        self.write_message('bye')
        MeterInfo.opened_sockets.remove(self)

    @classmethod
    def try_send_new_reading(cls):
        """Send new reading to all connected clients"""
        new_reading = "text"

        if new_reading == cls.previous_meter_reading:
            return

        cls.previous_meter_reading = new_reading

        for socket in cls.opened_sockets:
            socket.write_message({'A': new_reading})




if __name__ == '__main__':
    term_manager = SingleTermManager(shell_command=['bash'])
    handlers = [
        (r"/websocket", TermSocket, {'term_manager': term_manager}),
        (r"/()", tornado.web.StaticFileHandler, {'path': 'index.html'}),
        (r"/(.*)", tornado.web.StaticFileHandler, {'path': '.'}),
    ]
    app = tornado.web.Application(handlers)
    app.listen(8010)
    METER_CHECK_INTERVAL = 100  # ms
    ioloop.PeriodicCallback(MeterInfo.try_send_new_reading,METER_CHECK_INTERVAL).start()
    ioloop.IOLoop.instance().start()

我需要做的就是不断 ping 与某些连接的客户端。

【问题讨论】:

  • 我没有看到在handlers 列表中注册的MeterInfo 处理程序。否则您的代码似乎没问题。
  • 你能建议如何在处理程序中添加这个MeterInfo处理程序吗?
  • 和 TermSocket 完全一样:(r"/meter_info_ws", MeterInfo),.

标签: python websocket tornado


【解决方案1】:

websocket_ping_interval 是应用程序设置,因此您将其传递给Application 构造函数:

app = tornado.web.Application(handlers, websocket_ping_interval=10)

【讨论】:

  • 是的,我也做了这么简单的事情。但我无法在 chrome dev-tools 的框架部分看到任何数据。基本上不确定乒乓球是否真的发生了。
  • @PrakashPalnati 如果您尝试捕获客户端和 Tornado 服务器之间的 TCP 数据包,您会发现 Tornado 每 10 秒向客户端推送一次数据。
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多