Редактировать: учитывая, что вы не определяете протокол, это не полезно, но может быть полезно в других контекстах.
Предполагая, что это потоковый (TCP) сокет, вам необходимо реализовать собственный механизм создания сообщений (или использовать существующий протокол более высокого уровня, который это делает). Один простой способ - определить каждое сообщение как 32-битное поле целочисленной длины, за которым следует такое количество байтов данных.
Отправитель: взять длину пакета JSON, упаковать его в 4 байта с помощью модуля struct
, отправить его в сокет, а затем отправить пакет JSON.
Приемник: Повторное чтение из сокета до тех пор, пока у вас не будет как минимум 4 байта данных, используйте struct.unpack
для распаковки длины. Читайте из сокета, пока у вас не будет хотя бы столько данных, и это ваш JSON-пакет; все, что осталось - это длина следующего сообщения.
Если в какой-то момент вы захотите отправлять сообщения, состоящие из чего-то другого, кроме JSON, через один и тот же сокет, вы можете отправить код типа сообщения между длиной и полезной нагрузкой данных; поздравляю, вы изобрели еще один протокол.
Другой, немного более стандартный метод - протокол DJB Netstrings ; это очень похоже на систему, предложенную выше, но с длинами в кодированном виде вместо двоичной; он напрямую поддерживается фреймворками, такими как Twisted .