Russian Qt Forum

Qt => Работа с сетью => Тема начата: Fregloin от Сентября 30, 2013, 11:18



Название: Потоковый бинарный 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 ДО шифрования. Тогда данных больше чем раньше не будет. Ну и, конечно, с учетом предыдущего сообщения, шифрование бывает разным...