2017-07-08 90 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() 
相关问题