socket recv Python, как сделать признак окончания блока данных если они меньше буфера приема recv

у меня клиент отправляет данные из списка в цикле for i in spisok : socket.sendall(i) элементы списка имеют разную длину от 20 до 500 байт. на сервере мне нужно получить каждый элемент как как он есть и в неизменном виде отправить на обработку while True: data=socket.recv(1024), data.foo но почему то на приемной стороне функция recv на сервере иногда склеивает отправленные из клиента блоки, и отдает в переменную уже склеенный блок вместо того чтоб каждый раз возвращать отдельно отправленный блок. Как дать recv(1024) что блок получен и надо вернуть его? Можно ли как то указывать длину блока при передаче sendall(i)?


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

Автор решения: eri

Сделай протокол по типу tlv. Отправляешь сначала длинну, потом тело. На приемнике читай 2байта на длинну, потом читай сколько там указанно.

Или используй стандарт вроде mqtt.

→ Ссылка
Автор решения: Gor

Все получилось с разделением блоков признаком разделения b'\n'

Отправляю так socket.sendall(data+b'\n')

получаю так

struct=[] struct = socket.recv(1024).split(b'\n') for i in struct: foo(i)

→ Ссылка