2017-07-08 9 views
0

私は、Autobahn Twisted WebSocketResourceにアクセスする方法を示すために多くの例を探していますが、これを示す例は見つからないようです。ツイストルートリソースからAutobahn WebSocketResourceにアクセスするには?

Autobahn Twisted WebSocketResource exampleから、WebSocketServerFactoryをインスタンス化し、websocketプロトコルを設定してから、WebSocketResource(factory)を使用してwebsocketリソースを作成するとわかります。あなたはWebSocketのリソースを持っていたら、これはそうのようなSiteインスタンスを作成する前に、メインのツイストWebリソースパスに追加することができます

class WebSocketProtocol(WebSocketServerProtocol): 

    def onConnect(self, request): 
     print("WebSocket connection request: {}".format(request)) 

    def onMessage(self, payload, isBinary): 
     self.sendMessage(payload, isBinary) 

class HttpResource(resource.Resource): 
    isLeaf = True 

    def render_GET(self, request): 
     return "<html><h1>Hello World!</h1></html>" 

factory = WebSocketServerFactory(u"ws://127.0.0.1:8000") 
factory.protocol = WebSocketProtocol 
ws_resource = WebSocketResource(factory) 

root = HttpResource() 
root.putChild(b"ws", ws_resource) 

site = Site(root) 

だから私の理解がws://127.0.0.1:8000/ws上のすべての要求は、WebSocketのリソースにルーティングされるということです。ただし、/wsリソースは、ブラウザによって検出されないようです。 GETリクエストはうまく動作しますが、websocketリクエストはうまく動作しません。

限り行くのWebSocket要求として、ここで私はこの問題を解決する必要があると考えていたイベントの流れは、(私はそれらを実装するかどうかはわからない)です:

  1. ブラウザはUpgradeGET要求を送信しますヘッダーのwebsocketに送信します。
  2. render_GETメソッドのHttpResourceは、要求でこれを認識し、応答コードを101に設定するか、またはデータ通信を処理するためにwsリソースを見つける必要があります。 WebSocketは、WebSocketの要求を処理できるように、子リソースへのルートリソースから切り替えるにはどうすればよい

私の最初の考えは、wsをチェックするためにルートリソースでgetChildメソッドを使用することでした。 nameがwsの場合は、websocketリソースを返します。また、Twisted Web (isLeaf)は、ルートリソースクラスHttpResourceの下にあるisLeaf属性が存在しないか、ルートリソース上の子にアクセスできないことを示しています。

助けがあれば助かります。あなたが提供できるあらゆる助けがあれば、事前にありがとうございます。

乾杯!

ブライアン

答えて

0

アウトバーンとねじれについて読んでいくつかの時間後、私は動作するコードのスニペットに到着しました。必要に応じて、AutobahnのonConnectメソッドが要求を処理し、ヘッダーにピークを記録します。

class WebSocketProtocol(WebSocketServerProtocol): 

    def onConnect(self, request): 
     custom_header = {} 

     if request.headers['sec-websocket-key']: 
      custom_header['sec-websocket-protocol'] = 'graphql-ws' 
     return (None, custom_header) 

    def onMessage(self, payload, isBinary): 
     self.sendMessage(payload, isBinary) 

class HttpResource(Resource): 
    isLeaf = True 

    def render_GET(self, request): 
     return "<html><h1>Hello World!</h1></html>" 

factory = WebSocketServerFactory() 
factory.protocol = WebSocketProtocol 
ws_resource = WebSocketResource(factory) 

root = Resource() 
root.putChild("", HttpResource()) 
root.putChild(b"ws", ws_resource) 

site = Site(root) 
reactor.listenTCP(8000, site) 

reactor.run() 
関連する問題