Я использую встроенный модуль сокетов для создания клиентского сокета.
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
sock.settimeout(30.0)
sock.connect((host, port))
...
def recvall(sock, count):
buf = io.BytesIO()
while count:
newbuf = sock.recv(count)
buf.write(newbuf)
count -= len(newbuf)
return buf.getvalue()
msg = recvall(sock, 1024)
Иногда, несмотря на настройку тайм-аута, вызов recv
блокируется навсегда, когда происходит сбой процесса сервера. К сожалению, я не могу создать минимальный пример; мой пример с минимальным сервером имеет правильное поведение.