2016-11-16 9 views
0

私が探していたものをここに定期的に見つけたので、私はオーバーフローするのが新しいです。しかし今回は、どのように扱うべきか分かりません。私は竜巻websocketサーバーを設定し、別のクラスからwebsocketスレッドにアクセスしたいと思いますが、残念なことにwebsocketクラスは3つの異なる引数を必要とし、通常の方法ではアクセスできません。私は複数のクラスを持っている理由別のクラスの竜巻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 = set()の代わりに)をWebsocketHandlerの外側で使用しました。クライアント接続をリストに追加するには、connections.append(self)を使用して、閉じるときに削除します。connections.remove(self)メソッドの呼び出し

if len(connections) > 0: 
    connections[0].toggle() 
関連する問題