Имеется сервер на Python и клиент на java, необходимо в реал тайме отправлять данные клиенту. Пока реализовал тупо полным чтением, но если чтение чуть отстанет от записи - пиши пропало.
Для добавления надёжности думаю над следующими вариантами:
1. Перед отправкой JSON, отправлять фиксированной длинны строку, содержащую len(JSON)
2. Посимвольно парсить на стороне клиента, отделяя один JSON от другого
3. Фиксировать размер JSON'а путём добавления пустых символов
Какой вариант наиболее приемлемый? Какие есть либы для Python, упрощающие эту задачу?
Если твой json придет не полным или даже более чем полным любая либа которая парсит json тебе скажет валить отсюда
Отделять один json от другого можно считая { и }
javedimka, вопрос был скорее о либах, которые инкапсулируют отправку данных, отправляя, например, размер передаваемых данных, перед отправкой самих данных.
В парсинге json проблем не вижу, чтение блокирующие, если не смогли распарсить, читаем ещё символ и пробуем снова. Если ошибка чтения значит канал закрыт.
вопрос был скорее о либах, которые инкапсулируют отправку данных, отправляя, например, размер передаваемых данных, перед отправкой самих данных.
Ты собираешься отдельную либу использовать чтобы сделать так? Вот это вот так в одну строчку? sock.sendall("%s%s" % (len(data), data))
В парсинге json проблем не вижу, чтение блокирующие, если не смогли распарсить, читаем ещё символ и пробуем снова. Если ошибка чтения значит канал закрыт.
Даже если бы у тебя были не блокирующие сокеты это не было бы проблемой.
Читать надо не символ, а все, что есть в буффере, считая фигурные скобки, если для всех встреченных открывающих не нашлось закрывающей - не все данные пришли, буффер не трогаешь и ждешь новых поступлений. Как только для всех встреченных открывающих нашлись закрывающие - обрезаешь буффер по последнюю найденную закрывающую скобку включительно, отдаешь свой json на парсинг
Я привел пример, потому как не уверен, что данный способ коммуникации единственно правильный. В сети также встречал сообщения вида: фикс. часть содержащая размер заголовка + заголовок содержащий размер контента + контент.
Про json это уже детали реализации, с ним проблем не возникнет.
Сергей Шиловский,
Понял, вопрос в том стоит ли усложнять себе жизнь и сделать так как я увидел где-то в сети, ответ: Нет.
Какой вариант наиболее приемлемый? Какие есть либы для Python, упрощающие эту задачу?
2ой вариант наиболее приемлемый, потому что json self enclosed и нет необходимости добавлять его длину перед сообщением, а фиксировать размер добавляя пустые символы это сразу нет, потому что кол-во отправляемых данных может возрасти, тогда правку придется делать и на клиенте, и на сервере.
Либ нет, потому что они не нужны.