alexx11Зависание происходит в ситуации когда размер данных кратен recv_size (например, посылаем 2048 байт, а recv_size 1024). Метод _sock.recv(recv_size) прочитает две порции данных, станет ждать еще, но ничего не получит. В итоге таймаут и исключение.
Есть несколько вариантов решения проблемы:
1. Если известно что пакет будет меньше некоторого размера, например 2 КБ, укажи recv_size = 2048
2. В заголовке пакета первые несколько байт указывают размер данных SIZE. Твой метод read() сперва читает несколько байт, узнает SIZE и затем читает остальное recv(SIZE).
3. Самый распостраненный. В конце пакета передается разделитель, который означает конец пакета. После чтения каждой порции данных проверяем что там в конце.
BUFSIZE = 4096
END = '\r\n\r\n'
def _recv(sock):
r = ''
while 1:
chunk = sock.recv(BUFSIZE)
r += chunk
if r.endswith(END):
return r[:-4]
def _send(sock, data):
sock.send(data + END)