Ich bin neu in Tornado-Server in Python und versuchen, ein Ping-Pong in regelmäßigen Abständen zu den Clients verbunden. Ich habe etwas gesehen websocket_ping_interval
in Tornado-Dokumentation, konnte aber kein Beispiel finden, wie/wann es zu verwenden ist.Machen Sie Ping-Pong in regelmäßigen Abständen mit Tornado Websocket
Ich habe das folgende mit ioloop.PeriodicCallback
, aber scheint nicht zu tun 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()
Alles, was ich tun muß, ist es, die Kunden mit etwas verbunden Pingen zu halten.
Ich sehe nicht, 'MeterInfo' Handler in der' handlers' Liste eingetragen. Dein Code scheint ansonsten in Ordnung zu sein. – xyres
könnten Sie darüber beraten, wie Sie diesen 'MeterInfo' Handler in die Handler einfügen? –
Genau wie bei TermSocket: '(r"/meter_info_ws ", MeterInfo),'. – Fian