2016-11-16 102 views
0

我是新來堆棧溢出,因爲我經常在這裏找到我一直在尋找的東西。但這一次,我不知道如何處理它。我建立了一個龍捲風websocket服務器,並希望從另一個類訪問websocket線程,但不幸的是,websocket類需要三個不同的參數,並且不能用通常的方式訪問。從另一個類訪問龍捲風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

好的,我在WebsocketHandler之外使用了connections = [](而不是connections = set(),因爲它可以通過索引訪問)。要將打開的客戶端連接添加到列表中,我使用connections.append(self)將它們刪除,然後關閉connections.remove(self)

調用方法:

if len(connections) > 0: 
    connections[0].toggle()