2017-09-08 4 views
9

Ich habe eine Autobahn Websocket Server mit den typischen onX Funktionen in seinem Protokoll. Mein Problem ist, dass ich keinen Weg finden kann, um onX zu beenden, während ich weiter die verschiedenen Sachen mache, die ich machen wollte, als die spezifische Nachricht eintraf. Genauer gesagt, in meiner onMessage Funktion führe ich manchmal eine HTTP-Anfrage an eine API, die sehr langsam ist. Als Ergebnis wird der Client, der die Websocket-Nachricht gesendet hat, durch die onMessage Finalisierung des Servers blockiert. Selbst wenn ich self.sendMessage oder reactor.callFromThread(<http request here>), oder self.transport.loseConnection() von der Serverseite, in der onMessage Block, die onMessage ist immer noch die HTTP-Anfrage und mein Client wartet.Autobahn, auf onMessage Block

Dies ist Code meines Klienten:

@asyncio.coroutine 
def send(command,userPath,token): 
    websocket = yield from websockets.connect('wss://127.0.0.1:7000',ssl=ssl.SSLContext(protocol=ssl.PROTOCOL_TLSv1_2)) 
    data = json.dumps({"api_command":"session","body":command,"headers": {'X-User-Path': userPath, 'X-User-Token': token}}) 
    response = {} 
    try: 
     yield from websocket.send(data) 
    finally: 
     yield from websocket.close() 
    if 'command' in response: 
     if response['command'] == 'ACK_SESSION_COMMAND' or response['command'] == 'ACK_INITIALIZATION': 
      return ('OK',200) 
     else: 
      return('',400) 

Ich habe sogar versucht, nur websocket.send(data), vom Client, aber aus irgendeinem Grund ist es nicht die Daten senden (Ich sehe nicht, sie auf dem Server ankommen). Ich verstehe nicht, wie ich aus dem Block onMessage zurückkehren und meine HTTP-Anfrage fortsetzen kann.

Und um meine Situation zu erklären, möchte ich nur 1 ssl websocket Nachricht an meinen Server gesendet und sofort die Verbindung zu schließen. Alles, was das kann, passt zu mir.

Antwort

Verwandte Themen