Название: Потоковый бинарный JSON (с зжатием) Отправлено: Fregloin от Сентября 30, 2013, 11:18 Привет. Есть клиент и сервер. Клиент периодически (несколько раз в секунду) запрашивает данные у сервера. Обен производится в текстовом виде сейчас.
Траффик переменный, обычно сервер шлет данные об изменениях состояний объектов, и размер JSONа составляет несколько килобайт. Периодически (раз в минуту) сервер шлет все состояния объектов, размер уже порядка 700Кб текста. К серверу таких клиентов может подключаться довольно много, до десятка, иногда больше. Возникает задача передавать эти данные в бинарном виде и вероятно всего следует использовать какое то сжатие, т.к. данные теоретиски должны ужиматься хорошо. Вопрос, как это реализовать? Т.е. механизм запрос-ответ с асинхронным посылками команд на сервер и асинхроным ответом на команду, данные о состояниях преедаются постоянно. Читал про BSJON но не смог найти его реализацию на С++. Название: Re: Потоковый бинарный JSON (с зжатием) Отправлено: LisandreL от Октября 01, 2013, 13:55 Ну самый простой вариант, требующий минимум изменений - имеющийся протокол сжать универсальными «архиваторами».
zlib, например, (если речь о Qt - можно взять обёртку qConpress/qUncompress) или lzma SDK (не пробовал). Название: Re: Потоковый бинарный JSON (с зжатием) Отправлено: xokc от Октября 04, 2013, 09:45 Читал про BSJON но не смог найти его реализацию на С++. Как-то плохо искалиhttp://kenai.com/projects/mongoviewer/sources/svn/show/bson (http://kenai.com/projects/mongoviewer/sources/svn/show/bson) https://qt.gitorious.org/qtplayground/qtjsonstream/source/2c7a5a89ce98e682acfe12aacf5b3a833f52f0c9:src/bson (https://qt.gitorious.org/qtplayground/qtjsonstream/source/2c7a5a89ce98e682acfe12aacf5b3a833f52f0c9:src/bson) P.S. Сам не пользовался. Название: Re: Потоковый бинарный JSON (с зжатием) Отправлено: Fregloin от Октября 12, 2013, 20:41 Нашел интересное решение UniversalBSON. Написал реализацию, выходные данные получаются в среднем на 30% меньше что уже хорошо.
Название: Re: Потоковый бинарный JSON (с зжатием) Отправлено: LisandreL от Октября 13, 2013, 16:59 Попробуйте всё же мой вариант. Дописать буквально пару строк, а текстовые файлы zip жмёт обычно намного лучше, чем на 30%.
Ну хотя если большая часть вашего json'а - неповторяющиеся бинарные данные в каком-нибудь base64, то может 30% и нормальная величина. Название: Re: Потоковый бинарный JSON (с зжатием) Отправлено: Fregloin от Октября 17, 2013, 10:06 qConpress/qUncompress конечно можно глянуть, но суть в том что сервер написан на голом си без каких либо кутешных примочек, так что возникает вопрос совместимости.
Как вариант нужно искать статьи о потоковых данных, например вещание интернет радио или т.п. Еще есть мысли почитать про промышленные протоколы. Название: Re: Потоковый бинарный JSON (с зжатием) Отправлено: LisandreL от Октября 17, 2013, 10:27 qConpress/qUncompress конечно можно глянуть, но суть в том что сервер написан на голом си без каких либо кутешных примочек, так что возникает вопрос совместимости. На этот случай я вам предлагал zlib. Как раз таки чистый C.Из API вам хватит 3 функций: 1) compress или compress2 2) compressBound 3) uncompress Вот описание: http://zlib.net/manual.html#Utility (http://zlib.net/manual.html#Utility) - всего 1 нужный вам раздел. LZMA SDK (http://www.7-zip.org/sdk.html) скорее всего даст немного лучшее сжатие (и с C тоже дружит), но API там заметно сложнее, так что советую начать с первого варианта. Название: Re: Потоковый бинарный JSON (с зжатием) Отправлено: xokc от Октября 18, 2013, 10:33 Собственно плюс BSON по сравнению с JSON + сжатие при использовании в сетевых протоколах не только и не столько в его большей компактности, скорее - в возможности обрабатывать элементы документа не дожидаясь загрузки документа целиком. Если топикстартер такой особенностью BSON не пользуется, то подозреваю, что связка JSON + сжатие будет действительно эффективнее. Стоит только помнить, что сжатие тоже "бесплатно" не дается - на него расходуются вычислительные ресурсы сервера. Что же касается C реализаций текстовых компрессоров/декомпресcоров - то их сотни. Я, например, пользовался minilzo http://www.oberhumer.com/opensource/lzo/#minilzo[/url] - 3 h файла + 1 c файл с двумя функциями (compress/decompress).
Название: Re: Потоковый бинарный JSON (с зжатием) Отправлено: Fregloin от Октября 19, 2013, 20:34 Тут еще такое дело, что данные нужно зашифровывать при передаче. Вот такое тз. раньше не заморачивались, гоняли тупо текст в локальной сети. теперь нужно шифровать, + сжимать так как данных будет намного больше чем раньше.
Название: Re: Потоковый бинарный JSON (с зжатием) Отправлено: LisandreL от Октября 20, 2013, 01:29 Тут еще такое дело, что данные нужно зашифровывать при передаче. Вот такое тз. раньше не заморачивались, гоняли тупо текст в локальной сети. теперь нужно шифровать, + сжимать так как данных будет намного больше чем раньше. Ну на счёт шифрования дело такое…Уточните ТЗ, кто требует шифрование и для чего. Одно дело просто от снифа прикрыться - тут вариантов масса. Другое дело если надо какой-то категории защиты информации соответствовать. Там уже из вариантов практически только ГОСТовское шифрование с ключами из удостоверяющего центра. Название: Re: Потоковый бинарный JSON (с зжатием) Отправлено: xokc от Октября 21, 2013, 10:52 теперь нужно шифровать, + сжимать так как данных будет намного больше чем раньше. Сжимайте JSON ДО шифрования. Тогда данных больше чем раньше не будет. Ну и, конечно, с учетом предыдущего сообщения, шифрование бывает разным... |