Почему возникает таймаут?
Необходимо получать данные от 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:
.
Почему такое может происходить?