3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
1 | |
Варианты передачи потока разных данных08.10.2015, 16:53. Показов 5363. Ответов 84
Метки нет (Все метки)
У меня есть TCP клиент под андроид и TCP сервер на Qt под Windows. Мне нужно передать сначала большой обьем текстовых данных а затем передать изображение. Так вот проблема в том что по TCP все данные передаются одним потоком(то есть TCP гарантирует только надежность и порядок передачи данных, но что и когда будет прочитано не известно). Так вот вопрос такой. Во первых мне нужно передать текстовые данные разного назначения(ну к примеру, контакты, текстовые сообщения и тп) а на сервере соответственно эти текстовые данные нужно разделить и сгруппировать каждые в свой текстовый файл(ну соответсвенно если мы берем контакты они должны быть записаны на сервере в файл контактов, сообщения в файл сообщений и так далее). Так вот чтобы удобнее эти данные рассортировать на сервере как лучше их передавать в виде JSON и на сервере парсить этот JSON или же разделить эти группы данных какими нибудь разделителями(типа @,# и тп) и на сервере соответвенно выделять из буфера данные между этими разделителями??
И второе: Мне также нужно передавать изображение на сервер. Так вот как мне правильно отделить байты изображения от этих прочих данных чтобы изображение сохранить на сервере отдельно в файл?? Как лучше всего упаковать и отправить эти данные на клиенте андроид так чтобы их было легко рассортировать потом на сервере?? Подайте идею?? заранее благодарен
0
|
08.10.2015, 16:53 | |
Ответы с готовыми решениями:
84
Возможные варианты передачи данных с не лотусового веб сервера в Lotus Скорость передачи данных именованного потока Использование DLL для приема-передачи данных в разных приложениях Варианты очистки потока |
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
08.10.2015, 18:44 [ТС] | 3 |
а эти бинарные данные тоже в JSON упаковать??
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
08.10.2015, 20:01 [ТС] | 5 |
а мне еще звук нужно передать как его передать вместе с остальными данными но чтобы его можно было отдельно записать в звуковой файл?? Звуковой буфер можно в JSON запихнуть и распарсить на сервере??
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
10.10.2015, 00:07 [ТС] | 6 |
можно все эти данные не одним JSONом передавать а несколькими?? и читать соответственно на сервере несколько JSONов??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
10.10.2015, 00:18 | 7 |
Посмотри в сторону того как это делает протокол WebSocket.
Смысл примерно такой - при передаче текстового пакета используются спец символы STX в начале текста и ETX в конце. При передаче бинарных данных отправляется длина данных потом сами данные. а с JSON связывайся чем меньше тем лучше, особенно если есть возможность использовать бинарный протокол. и парсинг и енкодинг JSON повышают нагрузку на проц, и трафик гораздо больше чем при передаче бинарных данных. Есть правда один ньюанс с бинарными данными - одни процы используют big endian, другие low endian, это придется учесть если таргеты сервера и клиента разные.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
10.10.2015, 06:02 [ТС] | 8 |
А как выглядят и как поставить эти спец символы STX и ETX?? И как потом если у меня пришло в буфер много текстовых данных разных категорий то как мне потом в программе(сервере) разобрать какие данные к какой категории нужно относить?? Эти символы STX и ETX для каждой категории данных которую они ограничивают как то отличаются??
Добавлено через 1 минуту У меня сервер под Windows 7 а клиент андроид 4.2.2 и как мне учесть таргеты на что ориентироваться??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
10.10.2015, 13:04 | 9 |
Это символы ASСII, ниже 0x20, ну из той же серии что и CR LF. Отлавливать так же как и CRLF. В принципе можешь проектировать как угодно, но смысл в том что для пометки начала и конца текстового мессаджа используются символы которые в тексте не отображаются. Для них в принципе заведены в ASCII спец символы, и все ими пользуются уже лет этак 40 как минимум. Просто получается работают как переключатель парсера протокола на текстовый и обратно на бинарный.
А вот категорию помечаешь уже каким либо образом сам. к примеру два идущих подряд блока. один категория - второй текст категории. можешь опять же использовать спецсимвол, который означает что следом за ним идет код категории. К примеру можешь сделать что первый символ после STX - код категории. А можно сделать что код категории идет одним пакетом а все пакеты до следующего кода считаются относящимися к этой категории. Второй вариант посылаешь текст как бинарные данные в соответствующем пакете Это не от ОС зависит а от проца. У некоторых процов старший байт в слове идет последним, у некоторых первым. Делается либо установкой для формата передачи/хранения. На пример данные в GIF всегда в big endian, у кого по другому - тот при отображении переворачивает. Но для такого подхода необходимо знать структуру данных. Глобально делается только передачей бинарных данных в текстовом виде или BCD. Ну или посылкой перед каждым полем его длины в байтах. Хотя если у тебя только картинки, то там все обычно по принципу как у GIF-a - т.е. low big endian учтет уже программа отображения, твое дело передать/сохранить последовательность байт.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
10.10.2015, 14:21 [ТС] | 10 |
А проц на Windows у меня Intel CORE i5 Картинки JPEG можно??Но я же могу картинки и в текстовом режиме передать(конвертировать их в BASE64 на клиенте) и обратно раскодировать BASE64 на сервере в картинку и сохранить в файл JPEG и тогда от low big endian я не завишу разве нет?? А как например программно сгенерировать символ STX и ETX на С++ и сохранить в массив(буфер) чтобы программа его распознавала как этот символ ?? можно примерчик?? Я просто с такими разделителями не работал
Добавлено через 11 минут Можно пример программного сохранения в массив символа STX и ETX и потом извлечения текстовых данных между этими символами небольшой хотябы для наглядности(хочу посмотреть как это делается)?? Добавлено через 2 минуты а как бинарные данные как можно текст послать в пакете можно подробнее что имеется ввиду? Добавлено через 49 минут Я так понял по таблице ASCII что все символыкод которых от 0 до 31 десятичных есть специальные символы любые из них я могу использовать для разделения текстовых сообщений при передаче и пометке категорий верно?? я правильно понял??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|||||||||||
10.10.2015, 14:23 | 11 | ||||||||||
Смысл примерно такой:
Отправка:
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
||||||
10.10.2015, 15:28 [ТС] | 12 | |||||
Добавлено через 9 минут А если в буфере несколько сообщений, то их между собой тоже STX и ETX разделять или уже нужно задействовать и другие разделители(специальные символы LF, CR и другие для отделения например второго сообщения от первого, третьего от второго и тд.)?? Я так понимаю по TCP у нас гарантируется порядок доставки сообщений а поэтому идея такая - первое сообщение в буфере будет выделяться STX и ETX, а второе будет начинаться со следующего символа STX и заканчиваться вторым символом ETX третье сообщение будет начинаться с третьего символа STX и заканчиваться ETX правильно я рассуждаю?? Если нет поправьте?? Добавлено через 10 минут А категории каким кодом пометить?? Например 001K можно же а следуящая категория 002K можно так?? Все что идет между 001K и 002K относится к первой категории??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
10.10.2015, 15:51 | 13 |
В буфере имеется в виду в куске информации принятом в переменную Buffer?
Посмотри внимательно на код. Он вырезает то что между STX и ETX в общем потоке байт (ну если бы все полученные куски сшить в один), на какие куски он не был бы разделен,и отправляет каждую строку от STX и ETX в каллбек (по одному каллбеку на каждую встреченную пару STX-ETX, ну типа как текст между одноуровневыми скобками вырезает). Для этого и используется автомат состояний. А CR и LF так и остаются символами внутри текста. т.е. используя этот транспорт можешь передавать хоть целый текстовый файл в одном сообщении, он таким же текстовым файлом и останется, со всеми переводами строки, табуляциями и даже бипами (символ BELL) Добавлено через 12 минут Смотри внимательно что пишется в End. Он показывает дошли ли мы до конуа сообщения, т.е до ETX, или закончился буффер, и в следующем буффер ждать продолжения в каллбеке оработка данных, которая для транспорта уже не важна. Это называется декомпозиция. Транспортный протокол не задумывается о том как будет обрабатываться более высоким протоколом (в каллбеке)что через него транспартируют, более высокий протокол не задумывается над тем как транспортируют. В принципе вместо каллбека (или в каллбеке) можно сделать добавление в очередь сообщений, или какой либо другой механизм передачи полученных строк вышестоящему протоколу. Не важно. Есть в принципе два варианта отправки: 1-ый Socket->Send(STX+CategoryId+ETX); Socket->Send(STX+Data+ETX); второй: Socket->Send(STX+CategoryId+Data+ETX); При первом способе в callback OnTextMessage нужен автомат переключающий по первому сообщению режим обработки второго сообщения. Во втором способе в калбэке необходимо вырезать идентификатор режима из начала сообщения, т.е фактически переключить режим на лету.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
10.10.2015, 16:04 [ТС] | 14 |
Да в буфере это в куске информации принятой в переменную буфер верно я сказал ранее на счет STX и ETX относительно разделения многих сообщений?? И как пометить категории тогда дело в том что цифры у меня это тоже значимые символы(встречаются в номерах )?? Может тогда категории пометить LF и CR или как нибудь еще?? Например все что между первым LF и первым CR - первая категория, все что между вторым LF и вторым CR вторая категория можно же так??
Добавлено через 3 минуты А в каллбаке можно просто разделленные сообщения(которые уже пришли с клиента и разделены) выводить в текстовый файл и все?? Добавлено через 5 минут А картинки в Base 64 лучше конвертировать или передавать или можно прямо по байтам??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
10.10.2015, 16:42 | 15 |
Доделать ото что в автомате в mdBinary и передавать аки есть.
Ну да. Только еще разобрать по категориям. Это можно в принципе и в автомате транспорта сделать, но тогда его настройка усложняется, и сам автомат усложняется если номер категории не вмещается в байт. Я бы вообще код категории писал в первый символ сообщения, а в каллбеке уже смотрел бы что оно за категория, если категорий меньше 200. еще надо предусмотреть чтобы коды категорий не пересекались по значениям с STX и ETX. Добавлено через 11 минут Можно и так, но это усложнит и клиент и сервер, потому как в таком случае надо следить за порядком отправки. Да можно все что угодно. Хоть по порядку скармливать их компилятору C++. Чтобы было понятнее что происходит: К примеру клиент отправляет: Socket->Send(STX+AnisString("Message1")+ETX); Socket->Send(STX+AnisString("Message2")+ETX); Socket->Send(STX+AnisString("BigBigBigMessage3")+ETX); в результате каллбак вызовется 3 раза, и в него будет передано: При первом вызове: Message1 При втором вызове: Message2 При третьем вызове: BigBigBigMessage3 Если размеры файлов не шибко большие то работать все это будет на ура. С шибко большими их при обработке тоже придется на куски резать.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
10.10.2015, 17:00 [ТС] | 16 |
а почему для больших файлов прийдется резать на куски??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
10.10.2015, 17:27 | 17 |
Потому что они большие. Если к примеру начнешь гектар одним файлом трансферить то он сначала в один кусок соберется а потом уже его в каллбак передадут. А если 10 гектар? Памяти под собирающий буффер хватит? Опять же большой файл который передается долго лучше на куски порезать, чтобы в случае обрыва связи не слать все заново а продолжить с места обрыва.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
10.10.2015, 18:24 [ТС] | 18 |
а как можно целеком принять файл на сервере допустим я передаю текстовый файл в формате txt или изображение в формате JPEG. А на сервере мне нужно принять эти файлы целиком а не по байтам. Как это сделать и можно ли, можете пример кода приема файла на сервере написать небольшой именно момент приема??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|||||||||||
10.10.2015, 19:14 | 19 | ||||||||||
Прием это не момент. Это процесс.
К примеру если слать текстовый файл вот так:
Message1Message2BigBigBigMessage3. Это и есть собственно говоря файл. Если вместо сборки буффера поставить допись куска в файл или отправлять в каллбек не собранный буффер а куски, а в каллбеке опять же дописывать в файл то в результате на винте образуется файл одним куском. Это один вариант. Второй вариант - резать файл при передаче на кучки скажем по 10kb для примеру, а в каллбеке опять же дописывать файл. При этом прийдется предусмотреть переключение на режим файл или информация о файле. К примеру
После того как считал заданное количество кусков снова переключается в режим ожидания имени файла. Для бинарных примерно так же только размер передается сразу как размер пакета данных в бинарном виде. В принципе и текстовый файл можно передать как бинарный они ничем не отличаются. точно такой же набор байт. Текстовая часть протокола вообще нужна чтобы передавать короткий текст типа имени файла и тп. Добавлено через 31 минуту Вобщем то правильно они для разделения в протоколе управления передачей текста используются. В принципе использовать можно как угодно, но у них есть общепринятые назначения по управлению телетайпом (хотя то же касается и принтера и терминала, и вобщем то текстовых сетевых протоколов). К примеру - CR - возврат каретки (На реальном телетайпе по этому символу печатающая головка идет в начало строки) LF - новая строка (бумага прокручивается на одну строку) STX- начало текстового сообщения ETX - конец текстового сообщения BTB - начало блока текстовых сообщений ETB - конец блока текстовых сообщений BELL - звуковой сигнал (телетайп реально дзынткает колокольчиком,при печати в консоли - доска пищала динамиком, винда тоже вроде бипает, но консоль не трогал лет эдак со времен 1-го курса) TAB - отступ в несколько символов. и так у каждого из этих 32 символов свое общепринятое (стандартизированное в ASCII) назначение. И оно насколько встречал одинаково обычно используется и у 19" шкафов микро-эвм производства 1978-года, и у современных консольных девайсов. А все форточки это только графическое отображение информации передаваемой по большому счету тем же последовательным способом, что и к примеру у Siemens R-300 с 800kHz тактовой, перфораторами и телетайпами. Меняется только скорость передачи.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
13.10.2015, 16:02 [ТС] | 20 |
а если JSON передаешь а не набор байт то как его правильно на сервере принять?? какую функцию нужно использовать??
0
|
13.10.2015, 16:02 | |
13.10.2015, 16:02 | |
Помогаю со студенческими работами здесь
20
Модель передачи потока пакетов Что будет, если два разных потока попытаются отправить одновременно одному клиенту два разных пакета Сборка системника: варианты в разных ценовых категориях. Оптимизация передачи классов и методов и их обработки в разных модулях Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |