json_data = c.recv(16384).decode() # Increasing this doesn't help
TCP - это потоковый протокол, а не протокол сообщений.Нет гарантии, что если отправитель отправит все данные с одним send
, то они могут быть получены с одним recv
.
Если одноранговый узел отправляет только один JSON, а затем закрывает соединение, получатель может просто recv
, пока больше не будет доступных данных (recv
возвращает пустое сообщение) и объединить части:
data = b''
while True:
buf = c.recv(16384)
if not buf:
break
data = data + buf
json_data = data.decode()
Если вместо этого узел отправляет несколько «сообщений», то на уровне приложения должен быть какой-то индикатор сообщений, например, префикс каждого сообщения длиной (как в TLS), заканчивая каждое сообщение новой строкой (например,сделано в SMTP) или аналогичный.Затем получателю необходимо прочитать данные в соответствии с форматом сообщения, например сначала прочитать длину, а затем заданное количество байтов.