2017-05-07 3 views
0

Ich versuche tatsächlich, eine empfangene Nachricht (über Tornado Websocket) an ein bestimmtes Objekt zu senden.tornado Websocket Server: Wie erstelle ich ein neues Objekt zum Senden von on_message an dieses Objekt?

Mein Code sieht wie folgt aus:

clients = dict() 

class WebServer(object): 
    def __init__(self, port=8080): 

     define("port", default=port, help="Run on the given port", type=int) 

     app = tornado.web.Application([ 
     (r'/', IndexHandler), 
     (r'/(?P<Id>\w*)', MyWebSocketHandler), 
     (r"/static/(.*)", tornado.web.StaticFileHandler, {'path':'static/'}), 
     #(r'/ws', MyWebSocketHandler), 
     ]) 

     print("DSP Control Application | Browse to <IP>:"+str(port)+" and have fun!") 

     parse_command_line() 
     app.listen(options.port) 
     tornado.ioloop.IOLoop.instance().start() 


class IndexHandler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    def get(self, **kwargs): 
     if "Id" in kwargs.keys(): 
      print "Your client id is: %s" % (kwargs["Id"],) 
     self.render("index.html") 
     #self.finish() 


class MyWebSocketHandler(tornado.websocket.WebSocketHandler): 

    def open(self, *args, **kwargs): 
     self.id = kwargs["Id"] 
     self.stream.set_nodelay(True) 
     clients[self.id] = {"id": self.id, "object": self} 

    def on_message(self, message): 
     print "Client %s received a message: %s" % (self.id, message) 
     #self.write_message("Client id: %s" % (list,)) 


    def on_close(self): 
     if self.id in clients: 
      del clients[self.id] 

    def check_origin(self, origin): 
     return True 


if __name__ == "__main__": 

    server = WebServer() 

Es ist vor allem die grundlegende Tornado websocket Anwendung, die bereits arbeitet. Die Funktion on_message gibt mir jedes Mal, wenn ein Client eine Verbindung zu meinem Server herstellt, eine Nachricht an die Konsole aus. So weit so gut ...

Aber jetzt möchte ich ein neues Objekt aus meiner Steuerelementklasse instanziieren. Die Funktion on_message sollte die empfangene Nachricht an dieses Objekt senden.

Ich instanziieren das Objekt wie folgt aus:

class WebServer(object): 
    def __init__(self, port=8080): 

     define("port", default=port, help="Run on the given port", type=int) 

     # Instantiate a new Object from class "Control" 
     mycontrol = Control() 

     app = tornado.web.Application([ 
     (r'/', IndexHandler), 
     (r'/(?P<Id>\w*)', MyWebSocketHandler), 
     (r"/static/(.*)", tornado.web.StaticFileHandler, {'path':'static/'}), 
     #(r'/ws', MyWebSocketHandler), 
     ]) 

     ... 

Aber wie MyWebSocketHandler sagen,(), die er braucht mycontrol zu rufen, wenn er eine Nachricht empfangen wird. Ich habe keine Möglichkeit gefunden, dieses Objekt an das App-Objekt zu übergeben.

Können Sie mir bitte dabei helfen?

Grüße Borsty

Antwort

0

Sie Standard kwargs auf Ihre MyWebSocketHandler bei Anwendungserstellung Schritt passieren kann, wird kwargs zu initialize Methode Ihrer Handler übergeben werden http://www.tornadoweb.org/en/stable//web.html#tornado.web.RequestHandler.initialize

class WebServer(object): 
    def __init__(self, port=8080): 

     define("port", default=port, help="Run on the given port", type=int) 

     mycontrol = Control() 
     app = tornado.web.Application([ 
      (r'/', IndexHandler), 
      (r'/(?P<Id>\w*)', MyWebSocketHandler, {'control': mycontrol}), 
      (r"/static/(.*)", tornado.web.StaticFileHandler,{'path':'static/'}), 
     ]) 

Sie Bezug auf Ihre Steuerung speichern Instanz und verwenden Sie sie später

class MyWebSocketHandler(tornado.websocket.WebSocketHandler): 
    def initialize(self, control): 
     self.control = control 

    def open(self, *args, **kwargs): 
     self.id = kwargs["Id"] 
     self.stream.set_nodelay(True) 
     clients[self.id] = {"id": self.id, "object": self} 

    def on_message(self, message): 
     print "Client %s received a message: %s" % (self.id, message) 
     self.control.send(message) 
Verwandte Themen