2017-07-08 50 views
0

我一直在尋找許多示例來演示如何訪問高速公路Twisted WebSocketResource,但似乎無法找到顯示此示例的示例。如何從Twisted Root Resource訪問Autobahn WebSocketResource?

我從這個例子Autobahn Twisted WebSocketResource example瞭解到你實例化了一個WebSocketServerFactory,設置websocket協議,然後使用WebSocketResource(factory)來創建websocket資源。一旦你的WebSocket的資源,這可以在主扭曲Web資源路徑上添加創建Site情況下,像這樣前:

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. 瀏覽器發送一個GET請求與Upgrade到頭部的websocket。
  2. render_GETHttpResource上的方法需要在請求中識別出這一點,並將響應代碼設置爲101和/或找到ws資源來處理數據通信。

如何從根資源切換到子資源,以便websocket可以處理websocket請求?

我最初的想法是在根資源上使用getChild方法來檢查ws。如果名稱是ws,則返回websocket資源。我還在這裏閱讀:Twisted Web (isLeaf),根資源類HttpResource下的isLeaf屬性不能存在,或者您無法訪問根資源上的子項。

任何幫助將是偉大的。提前感謝您提供的任何幫助。

乾杯!

布賴恩

回答

0

一段時間後,閱讀有關高速公路和扭曲,我在的代碼片段工作的到來。如果需要,高速公路的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() 
相關問題