2017-09-08 11 views
9

Tôi có một máy chủ Websocket autobahn với các chức năng onX điển hình trong giao thức của nó. Vấn đề của tôi là tôi không thể tìm cách thoát ra khỏi onX, trong khi tiếp tục thực hiện các công cụ khác nhau mà tôi muốn làm khi thông điệp cụ thể đến. Cụ thể hơn trong hàm onMessage của tôi, đôi khi tôi thực hiện một yêu cầu HTTP đến một API rất chậm. Kết quả là, khách hàng gửi tin nhắn websocket đang bị chặn bởi kết quả của máy chủ là onMessage. Ngay cả khi tôi làm self.sendMessage hoặc reactor.callFromThread(<http request here>) hoặc self.transport.loseConnection() từ phía máy chủ, trong khối onMessage, onMessage vẫn đang thực hiện yêu cầu HTTP và ứng dụng khách của tôi chờ.Autobahn, để lại trênMột khối

Đây là mã khách hàng của tôi:

@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) 

Tôi thậm chí đã cố gắng để chỉ websocket.send(data), từ khách hàng, nhưng đối với một số lý do nó không gửi dữ liệu (tôi không thấy họ đến trong máy chủ). Tôi không hiểu làm thế nào tôi có thể trở về từ khối onMessage và tiếp tục yêu cầu HTTP của tôi.

Và để giải thích tình huống của tôi, tôi chỉ muốn gửi 1 tin nhắn websocket ssl tới máy chủ của tôi và ngay lập tức đóng kết nối. Bất cứ điều gì có thể làm điều đó, phù hợp với tôi.

Trả lời

Các vấn đề liên quan