Mam automatyczny serwer sieci Web z typowymi funkcjami onX
w jego protokole. Mój problem polega na tym, że nie mogę znaleźć sposobu na wyjście z onX
, podczas gdy dalej robię różne rzeczy, które chciałem zrobić, gdy nadejdzie konkretna wiadomość. Dokładniej w mojej funkcji onMessage
, czasami wykonuję żądanie HTTP do API, które jest bardzo wolne. W rezultacie klient, który wysłał wiadomość websocket, jest blokowany przez finalizowanie serwera onMessage
. Nawet jeśli wykonuję self.sendMessage
lub reactor.callFromThread(<http request here>)
lub self.transport.loseConnection()
od strony serwera, w bloku onMessage
, onMessage
nadal wykonuje żądanie HTTP i mój klient czeka.Autobahn, pozostaw na bloku wiadomości:
Jest to kod mojego klienta:
@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)
Próbowałem nawet tylko websocket.send(data)
, od klienta, ale z jakiegoś powodu nie wysyła dane (nie widzę ich przybyciu na serwerze). Nie rozumiem, jak mogę powrócić z bloku onMessage
i kontynuować wykonywanie mojego żądania HTTP.
I dla wyjaśnienia mojej sytuacji, chcę tylko wysłać wiadomość 1 ssl websocket na mój serwer i natychmiast zamknąć połączenie. Wszystko, co może to zrobić, pasuje do mnie.