【发布时间】: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),.