首页 文章

tornado Websocket Server:如何创建一个新对象来发送on_message到这个对象?

提问于
浏览
0

我实际上尝试将收到的消息(通过龙卷风websocket)发送到特定对象 .

我的代码看起来像这样:

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()

它主要是已经有效的基本龙卷风websocket应用程序 . 每次客户端连接到我的服务器时,on_message函数都会向控制台输出一条消息 . 到现在为止还挺好...

但是现在我想从我的控件类中实例化一个新对象 . on_message函数应该将收到的消息提供给该对象 .

我正在实例化这样的对象:

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),
        ])

        ...

但是如何告诉MyWebSocketHandler()他收到消息时需要调用mycontrol . 我发现无法将此对象移交给app对象 .

你能帮我解决这个问题吗?

关心Borsty

1 回答

  • 0

    您可以在应用程序创建步骤将默认kwargs传递给 MyWebSocketHandler ,kwargs将传递给处理程序的 initialize 方法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/'}),
            ])
    

    您可以存储对控件实例的引用,并在以后使用它

    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)
    

相关问题