2016-11-16 3 views
0

Я новичок в переполнении стека, потому что я регулярно нашел здесь то, что искал. Но на этот раз я не знаю, как с этим справиться. Я установил сервер websocket tornado и хотел бы получить доступ к потоку websocket из другого класса, но, к сожалению, класс websocket требует трех разных аргументов и недоступен обычным способом.Доступ к методу класса tornado websocket из другого класса

class WebSocketHandler(tornado.websocket.WebSocketHandler): 
    def open(self):  
     self.loop() 

    def on_message(self, message): 
     #do something 

    def on_close(self): 
     #do something else 

    def loop(self): 
     pass 

    def toggle(self): 
     #execute 

class EventHandler: 
    def __init__(self): 
     self.listener() 

    def listener(self):   
     def callback(channel): 
      wsHandler = WebSocketHandler() 
      wsHandler.toggle() 

     GPIO.add_event_detect(channel, GPIO.RISING, callback = callback, bouncetime = 1000) 

def main(): 
    EventHandler() 

    application = tornado.web.Application([ 
     (r"/", WebSocketHandler), 
    ]) 
    server = tornado.httpserver.HTTPServer(application) 
    server.listen(8888) 
    io_loop = tornado.ioloop.IOLoop.current() 
    io_loop.start() 

if __name__ == "__main__": 
    main() 

Причина, по которой у меня есть несколько классов, заключается в том, что сервер должен прослушивать входные события, даже если клиент не подключен. Но я должен передать входные данные через websocket, если таковой имеется. Я читал о методе add_callback, но я не уверен, полезен ли это.

Я рад любому решению. Спасибо большое!

+0

Кажись ты понял это, видя ваш ответ на этот вопрос [] (http://stackoverflow.com/a/40655053/794749). Вы должны ответить на свой вопрос здесь, а затем принять его. –

+0

Да, но это немного сложнее, потому что метод должен выполняться только один раз; независимо от того, сколько клиентов подключено. – Kjub

ответ

0

Хорошо, я использовал connections = [] (вместо connections = set(), потому что он доступен через индексирование) за пределами WebsocketHandler. Чтобы добавить клиентские соединения, открытые для списка, я использую connections.append(self), чтобы удалить их по закрытию connections.remove(self).

Вызов метода:

if len(connections) > 0: 
    connections[0].toggle() 
Смежные вопросы