Попробуйте использовать структуру, чтобы сначала передать длину входящих данных получателю, "import struct".Таким образом, принимающая сторона точно знает, сколько данных получить.В этом примере байты отправляются через сокет, примеры, которые я заимствовал из моего файла github для загрузки github.com/nsk89/netcrypt для справки, и вырезали шаги шифрования из функции send, а также для отправки сериализованного словаря.
Редактировать Я также должен уточнить, что при отправке данных через сокет, особенно если вы отправляете несколько сообщений, все они помещаются в поток как одно длинное сообщение.Не каждое сообщение имеет длину 4096 байт.Если один из них имеет длину 2048, а следующие 4096 и вы получаете 4096 на свои буферы, вы получите первое сообщение плюс половина следующего сообщения или полностью зависаете, ожидая больше данных, которых не существует.
data_to_send = struct.pack('>I', len(data_to_send)) + data_to_send # pack the length of data in the first four bytes of data stream, >I indicates internet byte order
socket_object.sendall(data_to_send) # transport data
def recv_message(socket_object):
raw_msg_length = recv_all(socket_object, 4) # receive first 4 bytes of data in stream
if not raw_msg_length:
return None
# unpack first 4 bytes using network byte order to retrieve incoming message length
msg_length = struct.unpack('>I', raw_msg_length)[0]
return recv_all(socket_object, msg_length) # recv rest of stream up to message length
def recv_all(socket_object, num_bytes):
data = b''
while len(data) < num_bytes: # while amount of data recv is less than message length passed
packet = socket_object.recv(num_bytes - len(data)) # recv remaining bytes/message
if not packet:
return None
data += packet
return data