2017-09-08 9 views
9

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.

Odpowiedz

Powiązane problemy