2017-11-28 5 views
0

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.

+0

Ich sehe nicht, 'MeterInfo' Handler in der' handlers' Liste eingetragen. Dein Code scheint ansonsten in Ordnung zu sein. – xyres

+0

könnten Sie darüber beraten, wie Sie diesen 'MeterInfo' Handler in die Handler einfügen? –

+1

Genau wie bei TermSocket: '(r"/meter_info_ws ", MeterInfo),'. – Fian

Antwort

0

websocket_ping_interval ist eine Anwendung, Einstellung, so dass Sie es auf den Application Konstruktor übergeben:

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

Ja, ich habe das auch so einfach gemacht. Aber ich bin nicht in der Lage, Daten in den Rahmen von Chrome-Dev-Tools zu sehen. Grundsätzlich nicht sicher, ob das Ping-Pong wirklich passiert. –

Verwandte Themen