【发布时间】:2017-05-07 11:44:29
【问题描述】:
我实际上尝试将接收到的消息(通过 tornado 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()
它主要是已经可以运行的基本 Tornado 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 对象。
你能帮我解决这个问题吗?
问候 博斯蒂
【问题讨论】: