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.