Как я могу использовать python-сокеты для отправки API-ответа по соединению? - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь заставить сервер ждать, пока клиент установит соединение, получить данные от клиента, использовать эти данные, чтобы сделать запрос API и отправить ответ клиенту. Все работает отлично, за исключением отправки ответа клиенту (функция клиента просто отключается). Если поместить conn.sendall («что-нибудь здесь») внутри цикла while True, это работает, но, очевидно, не возвращает то, что мне нужно для возврата. Размещение conn.sendall вне цикла приводит к тайм-ауту на стороне клиента.

Код сервера

conn, addr = s.accept()

print('Connected by', addr)
fragments = []
while True:
    chunk = conn.recv(4096)
    if not chunk:
        break
    fragments.append(chunk)

action = "".join(fragments)

URL = "http://172.31.55.211/" + action

print("making request")
r = requests.get(url = URL)
data = r.json()

conn.sendall(data['message'])

Код клиента

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print(s)
    s.connect((HOST, PORT))
    s.sendall(b'hellocvs')
    data = s.recv(1024)

    print('Received', repr(data))

    return {
        'statusCode': 200,
        'body': json.dumps(str(data))
    }

1 Ответ

0 голосов
/ 31 мая 2019

В строке action = "".join(fragments) серверный код не будет запущен, потому что fragments равен bytes not string, поэтому вам необходимо b''.join(fragments) для объединения байтов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...