代码之家  ›  专栏  ›  技术社区  ›  Brian

如何为客户端设置子策略列表(Twisted)

  •  0
  • Brian  · 技术社区  · 7 年前

    大家好,

    我创建了一个客户端和一个服务器来通过WebSocket进行通信。Twisted库用于WebSocket,最终我将从客户端向服务器发送GraphQL字符串。

    然而,我得到一个错误,说明:

    failing WebSocket opening handshake ('subprotocol selected by server (graphql-ws) not in subprotocol list requested by client ([])')

    下面是我创建的示例代码:

    服务器py公司

    class MyServerProtocol(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 onOpen(self):
        print "Websocket connection open"
    
      def onMessage(self, payload, isBinary):
        # Handle GraphQL query string here
        try:
          parsed_message = json.loads(payload)
        except Exception as exp:
          logger.error('Could not parse websocket payload', exc_info=True)
          self.sendClose()
          return 1
    
      def onClose(self, wasClean, code, reason):
        print("WebSocket connection closed: {0}".format(reason))
    

    客户py公司

    class MyClientProtocol(WebSocketClientProtocol):
    
      def onConnect(self, response):
        response.protocol = 'graphql-ws'
    
      def onOpen(self):
        print "Websocket connection open"
    
      def onMessage(self, payload, isBinary):
        if isBinary:
            print("Binary message received: {0} bytes".format(len(payload)))
        else:
            print("Text message received: {0}".format(payload.decode('utf8')))
    
      def onClose(self, wasClean, code, reason):
        print("WebSocket connection closed: {0}".format(reason))
    

    有人知道如何在客户端设置子程序列表吗?任何帮助都将不胜感激。

    谢谢

    布瑞恩

    2 回复  |  直到 7 年前
        1
  •  1
  •   Umberto    5 年前

    创建工厂后,可以附加自定义子协议:

    factory = WebSocketClientFactory("wss://SERVER_URL")
    factory.protocol = MyClientProtocol
    
    # append custom protocols here:
    factory.protocols.append("graphql-ws")
    
    connectWS(factory)
    

    小心“s”(协议<=>协议)。您可以在“onConnect”方法的响应中检查协议是否已被服务器接受:

    def OnConnect(self, response):
         print(response)
    
    output: {"peer" : "...", "headers" : { ... }, "protocol": "graphql-ws", ...}
    
        2
  •  -1
  •   user2308728    7 年前

    新的WebSocket(Url,协议[])第二个参数是可选的。检查协议参数中允许的字符。第二个是字符串或字符串[]。我不确定你是否要求这样做。