我一直在尋找許多示例來演示如何訪問高速公路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的請求去,這裏是事件,我相信應該可以解決這個問題的流量(我只是不知道如何實現它們):
- 瀏覽器發送一個
GET
請求與Upgrade
到頭部的websocket。 render_GET
HttpResource
上的方法需要在請求中識別出這一點,並將響應代碼設置爲101和/或找到ws
資源來處理數據通信。
如何從根資源切換到子資源,以便websocket可以處理websocket請求?
我最初的想法是在根資源上使用getChild
方法來檢查ws
。如果名稱是ws
,則返回websocket資源。我還在這裏閱讀:Twisted Web (isLeaf),根資源類HttpResource
下的isLeaf
屬性不能存在,或者您無法訪問根資源上的子項。
任何幫助將是偉大的。提前感謝您提供的任何幫助。
乾杯!
布賴恩