Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/27: Рейтинг темы: голосов - 27, средняя оценка - 4.52
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331

Варианты передачи потока разных данных

08.10.2015, 16:53. Показов 6567. Ответов 84
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть TCP клиент под андроид и TCP сервер на Qt под Windows. Мне нужно передать сначала большой обьем текстовых данных а затем передать изображение. Так вот проблема в том что по TCP все данные передаются одним потоком(то есть TCP гарантирует только надежность и порядок передачи данных, но что и когда будет прочитано не известно). Так вот вопрос такой. Во первых мне нужно передать текстовые данные разного назначения(ну к примеру, контакты, текстовые сообщения и тп) а на сервере соответственно эти текстовые данные нужно разделить и сгруппировать каждые в свой текстовый файл(ну соответсвенно если мы берем контакты они должны быть записаны на сервере в файл контактов, сообщения в файл сообщений и так далее). Так вот чтобы удобнее эти данные рассортировать на сервере как лучше их передавать в виде JSON и на сервере парсить этот JSON или же разделить эти группы данных какими нибудь разделителями(типа @,# и тп) и на сервере соответвенно выделять из буфера данные между этими разделителями??
И второе: Мне также нужно передавать изображение на сервер. Так вот как мне правильно отделить байты изображения от этих прочих данных чтобы изображение сохранить на сервере отдельно в файл??
Как лучше всего упаковать и отправить эти данные на клиенте андроид так чтобы их было легко рассортировать потом на сервере?? Подайте идею?? заранее благодарен
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.10.2015, 16:53
Ответы с готовыми решениями:

Возможные варианты передачи данных с не лотусового веб сервера в Lotus
Разрабатываю тему по получению данных с веб-формы расположенной не на лотусовом сервере в лотусовую базу как документ. Что можно покрутить...

Скорость передачи данных именованного потока
Привет всем! У кого-нибудь есть сведения о скорости и задержке передачи данных через именованный поток на локальной машине? У меня...

Использование DLL для приема-передачи данных в разных приложениях
Здраствуйте, я новичок в С++, недавно столкнулся с проблемой, не могу передать два числа типа int из одной программы, созданной в С++...

84
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.10.2015, 16:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от yura91 Посмотреть сообщение
а если JSON передаешь а не набор байт то как его правильно на сервере принять?? какую функцию нужно использовать??
JSON- это такое же текстовое сообщение, просто имеющее определенную внутреннюю структуру
Передаешь его как текстовое сообщение а внутри OnMessage расшифровываешь тоже автоматом состояний. Для этого в принципе существуют готовые библиотеки обычно в наборе той библиотеки которую используешь.
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
13.10.2015, 16:57  [ТС]
расшифровываешь - это имеется ввиду парсинг JSON??
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.10.2015, 17:29
Цитата Сообщение от yura91 Посмотреть сообщение
расшифровываешь - это имеется ввиду парсинг JSON??
Да именно это
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
13.10.2015, 17:38  [ТС]
то есть я так понял файлы по tcp можно передавать только по байтам и большие файлы нужно резать при передаче?? Но есть же функция transmitfunction() или как то так которая по tcp передает сразу файл а как работает она??
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.10.2015, 18:14
Общий принцип - через сокет идет поток байт. Для того чтобы управлять потоком (т.е. определять что именно (какого типа, какого назначения и т.д) в данный момент передается и сколько) вклиниваются метаданные (разделители, символы начала и конца блоков, размер блоков и т.п).
Для файла естественно куча вариантов в зависимости от того бинарный он или текстовый и того какая информация еще о нем должна быть передана. В общем случае файл удобнее рассматривать как бинарный. Определяешь структуру описания файла файла. и приклеиваешь в передачу перед бинарными данными файла, вместе с командой "передаю файл". Принимающая сторона принимает команду, по ней включается в режим ожилания файла, из первого куска вырезает структуру описания, по ней производит подготовку места для приема (хранилище), последующие за структурой описания данные складирует в подготовленное место. По концу приема закрывает хранилище и переходит в режим ожидания новой команды. Т.е. принимающая часть - это автомат выполняющий команды передающей.
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
13.10.2015, 20:21  [ТС]
А как читать данные и записывать в звуковой файл на Qt?? Я знаю что звуковой файл состоит из заголовка и данных. В заголовке хранятся метаданные(частота и прочее). Можете дать ссылку на код как можно прочитать заголовок и данные звукового файла в буфер а потом записать этот буфер в другой созданный wav файл??
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.10.2015, 20:44
Цитата Сообщение от yura91 Посмотреть сообщение
А как читать данные и записывать в звуковой файл на Qt?? Я знаю что звуковой файл состоит из заголовка и данных. В заголовке хранятся метаданные(частота и прочее). Можете дать ссылку на код как можно прочитать заголовок и данные звукового файла в буфер а потом записать этот буфер в другой созданный wav файл??
В смысле при передаче этого звукового файла по сети или вообще?
Если при просто передаче - то тебе неважно что там внутри. Просто набор байт длины n обозванный именем name.
Если вообще - то зависит от формата файла. С этим в MSDN. Блин, вот кучу раз обрабатывал звук на лету (прям с микрофона) а писать в файл не приходилось. А данные с АЦП если и писал то в файл своего формата.
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
13.10.2015, 20:48  [ТС]
Нет не по сети а вообще чтение запись звуковых файлов можно примерчик кода небольшой как это делать?? Я так понял сначала надо писать заголовок а потом данные?? А что в заголовке хранится?? там помоему частота и что еще??
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.10.2015, 20:56
Цитата Сообщение от yura91 Посмотреть сообщение
А что в заголовке хранится?? там помоему частота и что еще??
Зависит от формата. В том же wav в начале идет код формата, а дальше в нем может быть и mp3 и PCM и вообще все что угодно.

Добавлено через 3 минуты
Вот тут простой примерчмк с расписанной структурой заголовка
http://www.codeproject.com/Art... -WAV-Files
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
13.10.2015, 21:10  [ТС]
а по сети мне нужно данные заголовка передавать если я хочу передать звуковой файл с клиента на сервер и на сервере его проиграть этот файл??
В том же wav в начале идет код формата, а дальше в нем может быть и mp3 и PCM и вообще все что угодно
Хорошо и как я в таком случае на сервере буду формировать заголовок для байтов звука?? Я ж не знаю что в нем идет. Байты я передал а как их в файл записать как заголовок сформировать??

Добавлено через 2 минуты
там же перед байтами нужно заголовок в файл записать
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.10.2015, 21:26
Цитата Сообщение от yura91 Посмотреть сообщение
там же перед байтами нужно заголовок в файл записать
При передаче у тебя подход - файл это именованный набор байт. Что внутри для передачи вообще не важно. Тебе важно предусмотреть передачу информации 1. Как оно обзывается и/или какова его суть. 2, Каков его размер. 3. Передать сами байты.
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
13.10.2015, 22:42  [ТС]
а если допустим я передаю данные и в этот момент пропал вай фай или с соединением что то. Но передача идет по TCP что в этом случае будет с пакетом он пропадет или когда появится(восстановится) соединение все равно повторно отправится на сервер?? Да на счет подхода я понял, но на счет звукового файла меня интересует не столько сама передача сколько какие данные нужно писать в заголовок звукового файла чтобы нормально его воспроизвести на сервере??Я так понимаю что сначала надо записать заголовок а потом уже сами данные в звуковой файл?? А что в этот заголовок и в каком порядке нужно писать не пойму
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.10.2015, 22:59
Цитата Сообщение от yura91 Посмотреть сообщение
Да на счет подхода я понял, но на счет звукового файла меня интересует не столько сама передача сколько какие данные нужно писать в заголовок звукового файла чтобы нормально его воспроизвести на сервере??Я так понимаю что сначала надо записать заголовок а потом уже сами данные в звуковой файл?? А что в этот заголовок и в каком порядке нужно писать не пойму
По большому счету на сегодняшний день это проблема не твоя а API операционки. Твоя задача указать ей формат и дать сами PCM данные.

Добавлено через 3 минуты
Цитата Сообщение от yura91 Посмотреть сообщение
Но передача идет по TCP что в этом случае будет с пакетом он пропадет или когда появится(восстановится) соединение все равно повторно отправится на сервер??
Пр обрыве коннекции сокет закроется. Когда клиент восстановит подключение он приконнектится снова и соответсвенно создастся новый экземпляр сокета (endpoint). Т.е фактически та сессия что была до обрыва связи закончилась и началась новая.
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
14.10.2015, 00:28  [ТС]
Т.е фактически та сессия что была до обрыва связи закончилась и началась новая.
То есть если даже я нигде на клиенте не сохранил те данные при передаче которых произошел обрыв соединения то эти данные все равно при восстановлении соединения отправятся на сервер автоматически??. Мне не нужно учитывать в своей программе возможность обрыва соединения?? Что такое PCM данные?? И как указать ей формат операционке??

Добавлено через 7 минут
К тому же помоему нужно записывать в заголовок число каналов и так далее верно??
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
14.10.2015, 01:29
Цитата Сообщение от yura91 Посмотреть сообщение
Что такое PCM данные??
PCM - Pulse Code Modulation. Т.е массив значений сигнала. Ну то что приходит с микрофона.
Цитата Сообщение от yura91 Посмотреть сообщение
И как указать ей формат операционке??
Смотри в SDK по операционке. В винде эти функции по одному называются, в андроиде java классы по другому.
Цитата Сообщение от yura91 Посмотреть сообщение
Мне не нужно учитывать в своей программе возможность обрыва соединения??
Да нужно.
Цитата Сообщение от yura91 Посмотреть сообщение
То есть если даже я нигде на клиенте не сохранил те данные при передаче которых
произошел обрыв соединения то эти данные все равно при восстановлении соединения отправятся на сервер автоматически??
Нет. Сокет скажет ошибка отправки, при этом вернет сколько байт успел отправить. Сам буффер кстати из которого отправлял не изменится пока ты его как то не изменишь. Т.е. пр обрыве связи с клиента необходимо в таком случае снова приконнектится, утрясти с сервером кто мы и что мы (handshake, login и т.п.) сообщить что будем делать (к примеру послать команду докачка такого то фала с такой то позиции) и начать опять передачу данных.
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
19.10.2015, 14:33  [ТС]
а если я использую tcp написанный на Qt то в случае обрыва соединения нужно ловить сигнал disconnected()??
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
19.10.2015, 16:17
Цитата Сообщение от yura91 Посмотреть сообщение
а если я использую tcp написанный на Qt то в случае обрыва соединения нужно ловить сигнал disconnected()??
Ну это в референсе по компонентам Qt. но наверное примерно так. А там что у компонента ServerSocet в Object Inspector нет списка сигналов которые он посылает и нажав на сигнал разве нельзя создать обработчик?
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
19.10.2015, 16:41  [ТС]
Всмысле вы имеете ввиду посмотреть документацию по ServerSocket Qt какие есть сигналы да??

Добавлено через 10 минут
А там что у компонента ServerSocet в Object Inspector нет списка сигналов которые он посылает и нажав на сигнал разве нельзя создать обработчик?
Ну так обрыв соединения нужно обрабатывать на клиенте а не на сервере. Просто если я уже передал часть данных, но не все что запланировал при одном подключении клиента к серверу. И во первых я должен как то понять что обрыв соединения произошел внезапно а не клиент и сервер закрыли сокет и сессия прошла нормально. Так вот как это понять?? сигнал disconnected() сработает в любом случае закрытия сокета. И потом если я уже часть данных передал и не хочу передавать эту часть снова при новом подключении, а хочу передать только оставшуюся. Может есть смысл передавать размер передаваемой информации и на сервере анализировать пришло все или нет??
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
19.10.2015, 18:03
Цитата Сообщение от yura91 Посмотреть сообщение
И во первых я должен как то понять что обрыв соединения произошел внезапно а не клиент и сервер закрыли сокет и сессия прошла нормально.
При обрыве соединения сокет тоже закрывается. А вот тут и можно определить это обрыв или штатное закрытие. Например предусмотреть в протоколе сигнал "конец связи" по которому сервер закрывает соеденение. Ну или смотреть по состоянию автомата приема в момент закрытия. Если автомат в режиме ожидания команды значит закрытие штатное. Если в другом режиме - (не получен конец буффера, не считано заданное количество байт, не завершена группа команд протокола и т.п.) - значит обрыв.

Добавлено через 6 минут
Цитата Сообщение от yura91 Посмотреть сообщение
Ну так обрыв соединения нужно обрабатывать на клиенте а не на сервере.
Его нужно обрабатывать и на клиенте и на сервере. При этом у ClientSocket есть тот же набор событий включая OnDisconneted OnConnected и т.д. В Qt они может по другому как то называются но смысл именно такой, он из логики работы самих сокетов.

Добавлено через 4 минуты
Цитата Сообщение от yura91 Посмотреть сообщение
Может есть смысл передавать размер передаваемой информации и на сервере анализировать пришло все или нет??
Ну да. А вообще перед передачей туда нового файла неплохо бы спросить у сервера что там уже есть на эту тему. Да кстати а компонент HTTPServer в QT есть? А то пытаемся сейчас на коленке родить методы HEAD GET POST и PUT http протокола. Хотя у вас как понял основная масса данных бинарная, для них удобнее FTPServer, возможно частично с управлением через HTTP
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
19.10.2015, 19:48  [ТС]
C++ (Qt)
1
Ну или смотреть по состоянию автомата приема в момент закрытия. Если автомат в режиме ожидания команды значит закрытие штатное
ну тогда в автомате нужно предусмотреть еще разные команды то есть если все норм то значение Ok в другом случае обрыв верно??

Добавлено через 2 минуты
C++ (Qt)
1
А вообще перед передачей туда нового файла неплохо бы спросить у сервера что там уже есть на эту тему
если так то нужно возвращать на клиент данные и там анализировать что есть верно?? А FTPServer в Qt можно создать??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.10.2015, 19:48

Варианты очистки потока
Всем доброго времени суток! Имеется задача следующего вида: Есть два контейнера, в которых элементам задано свойство float. Из-за этого...

Модель передачи потока пакетов
Здравствуйте! Есть задача: На канал поступает для передачи поток пакетов с равномерным распределением промежутка времени между...

Что будет, если два разных потока попытаются отправить одновременно одному клиенту два разных пакета
Здравствуйте! Имеется вот такой незамысловатый метод отправки пакетов на сокет клиента public static void...

Сборка системника: варианты в разных ценовых категориях.
Лет 5 назад я с уверенностью справился бы и сказал что и откуда брать, куда ставить и прочее прочее, при этом и цену сказал бы. Но, в связи...

Оптимизация передачи классов и методов и их обработки в разных модулях
Доброго времени суток. Работаю над сложной программой, позволяющей считать таблицу Excel вида "номер-коордХ-коордY-вид...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru