Почему возникает таймаут?

Необходимо получать данные от TCP-сервера с помощью сокета на втором питоне

import json
import socket
from contextlib import contextmanager

HOST = "127.0.0.1"
PORT = 50000


@contextmanager
def _socket_manager(host, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(3)
    try:
        sock.connect((host, port))
        yield sock
    except Exception as e:
        print("An error occurred: {}".format(e))
        raise
    finally:
        sock.close()


def request(req):
    try:
        with _socket_manager(HOST, PORT) as sock:
            sock.send(req.encode("utf-8"))
            response_data = b""
            while True:
                try:
                    part = sock.recv(1024).decode("utf-8")
                    if not part:
                        break
                    response_data += part
                except socket.timeout:
                    print("Timeout while receiving data")
                    break
            if response_data:
                return json.loads(response_data)
            print("Empty data from TCP-server")
            return None
    except Exception as e:
        print("An error occurred: {}".format(e))
        return None

Данные приходят корректно, но всегда перед их печатью возникает socket.timeout. Пробовал другой порт, увеличивать таймаут. Подозреваю, что раз данные полные, то возникает при попытке получить данные, когда они все уже получены, но тогда должна работать строка if not part:. Почему такое может происходить?


Ответы (0 шт):