3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
1 | |
Варианты передачи потока разных данных08.10.2015, 16:53. Показов 5360. Ответов 84
Метки нет (Все метки)
У меня есть TCP клиент под андроид и TCP сервер на Qt под Windows. Мне нужно передать сначала большой обьем текстовых данных а затем передать изображение. Так вот проблема в том что по TCP все данные передаются одним потоком(то есть TCP гарантирует только надежность и порядок передачи данных, но что и когда будет прочитано не известно). Так вот вопрос такой. Во первых мне нужно передать текстовые данные разного назначения(ну к примеру, контакты, текстовые сообщения и тп) а на сервере соответственно эти текстовые данные нужно разделить и сгруппировать каждые в свой текстовый файл(ну соответсвенно если мы берем контакты они должны быть записаны на сервере в файл контактов, сообщения в файл сообщений и так далее). Так вот чтобы удобнее эти данные рассортировать на сервере как лучше их передавать в виде JSON и на сервере парсить этот JSON или же разделить эти группы данных какими нибудь разделителями(типа @,# и тп) и на сервере соответвенно выделять из буфера данные между этими разделителями??
И второе: Мне также нужно передавать изображение на сервер. Так вот как мне правильно отделить байты изображения от этих прочих данных чтобы изображение сохранить на сервере отдельно в файл?? Как лучше всего упаковать и отправить эти данные на клиенте андроид так чтобы их было легко рассортировать потом на сервере?? Подайте идею?? заранее благодарен
0
|
08.10.2015, 16:53 | |
Ответы с готовыми решениями:
84
Возможные варианты передачи данных с не лотусового веб сервера в Lotus Скорость передачи данных именованного потока Использование DLL для приема-передачи данных в разных приложениях Варианты очистки потока |
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
13.10.2015, 16:48 | 21 |
JSON- это такое же текстовое сообщение, просто имеющее определенную внутреннюю структуру
Передаешь его как текстовое сообщение а внутри OnMessage расшифровываешь тоже автоматом состояний. Для этого в принципе существуют готовые библиотеки обычно в наборе той библиотеки которую используешь.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
13.10.2015, 16:57 [ТС] | 22 |
расшифровываешь - это имеется ввиду парсинг JSON??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
13.10.2015, 17:29 | 23 |
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
13.10.2015, 17:38 [ТС] | 24 |
то есть я так понял файлы по tcp можно передавать только по байтам и большие файлы нужно резать при передаче?? Но есть же функция transmitfunction() или как то так которая по tcp передает сразу файл а как работает она??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
13.10.2015, 18:14 | 25 |
Общий принцип - через сокет идет поток байт. Для того чтобы управлять потоком (т.е. определять что именно (какого типа, какого назначения и т.д) в данный момент передается и сколько) вклиниваются метаданные (разделители, символы начала и конца блоков, размер блоков и т.п).
Для файла естественно куча вариантов в зависимости от того бинарный он или текстовый и того какая информация еще о нем должна быть передана. В общем случае файл удобнее рассматривать как бинарный. Определяешь структуру описания файла файла. и приклеиваешь в передачу перед бинарными данными файла, вместе с командой "передаю файл". Принимающая сторона принимает команду, по ней включается в режим ожилания файла, из первого куска вырезает структуру описания, по ней производит подготовку места для приема (хранилище), последующие за структурой описания данные складирует в подготовленное место. По концу приема закрывает хранилище и переходит в режим ожидания новой команды. Т.е. принимающая часть - это автомат выполняющий команды передающей.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
13.10.2015, 20:21 [ТС] | 26 |
А как читать данные и записывать в звуковой файл на Qt?? Я знаю что звуковой файл состоит из заголовка и данных. В заголовке хранятся метаданные(частота и прочее). Можете дать ссылку на код как можно прочитать заголовок и данные звукового файла в буфер а потом записать этот буфер в другой созданный wav файл??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
13.10.2015, 20:44 | 27 |
В смысле при передаче этого звукового файла по сети или вообще?
Если при просто передаче - то тебе неважно что там внутри. Просто набор байт длины n обозванный именем name. Если вообще - то зависит от формата файла. С этим в MSDN. Блин, вот кучу раз обрабатывал звук на лету (прям с микрофона) а писать в файл не приходилось. А данные с АЦП если и писал то в файл своего формата.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
13.10.2015, 20:48 [ТС] | 28 |
Нет не по сети а вообще чтение запись звуковых файлов можно примерчик кода небольшой как это делать?? Я так понял сначала надо писать заголовок а потом данные?? А что в заголовке хранится?? там помоему частота и что еще??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
13.10.2015, 20:56 | 29 |
Зависит от формата. В том же 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 [ТС] | 30 |
а по сети мне нужно данные заголовка передавать если я хочу передать звуковой файл с клиента на сервер и на сервере его проиграть этот файл??
Добавлено через 2 минуты там же перед байтами нужно заголовок в файл записать
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
13.10.2015, 21:26 | 31 |
При передаче у тебя подход - файл это именованный набор байт. Что внутри для передачи вообще не важно. Тебе важно предусмотреть передачу информации 1. Как оно обзывается и/или какова его суть. 2, Каков его размер. 3. Передать сами байты.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
13.10.2015, 22:42 [ТС] | 32 |
а если допустим я передаю данные и в этот момент пропал вай фай или с соединением что то. Но передача идет по TCP что в этом случае будет с пакетом он пропадет или когда появится(восстановится) соединение все равно повторно отправится на сервер?? Да на счет подхода я понял, но на счет звукового файла меня интересует не столько сама передача сколько какие данные нужно писать в заголовок звукового файла чтобы нормально его воспроизвести на сервере??Я так понимаю что сначала надо записать заголовок а потом уже сами данные в звуковой файл?? А что в этот заголовок и в каком порядке нужно писать не пойму
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
13.10.2015, 22:59 | 33 |
По большому счету на сегодняшний день это проблема не твоя а API операционки. Твоя задача указать ей формат и дать сами PCM данные.
Добавлено через 3 минуты Пр обрыве коннекции сокет закроется. Когда клиент восстановит подключение он приконнектится снова и соответсвенно создастся новый экземпляр сокета (endpoint). Т.е фактически та сессия что была до обрыва связи закончилась и началась новая.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
14.10.2015, 00:28 [ТС] | 34 |
Добавлено через 7 минут К тому же помоему нужно записывать в заголовок число каналов и так далее верно??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
14.10.2015, 01:29 | 35 |
PCM - Pulse Code Modulation. Т.е массив значений сигнала. Ну то что приходит с микрофона.
Смотри в SDK по операционке. В винде эти функции по одному называются, в андроиде java классы по другому.
Да нужно.
Нет. Сокет скажет ошибка отправки, при этом вернет сколько байт успел отправить. Сам буффер кстати из которого отправлял не изменится пока ты его как то не изменишь. Т.е. пр обрыве связи с клиента необходимо в таком случае снова приконнектится, утрясти с сервером кто мы и что мы (handshake, login и т.п.) сообщить что будем делать (к примеру послать команду докачка такого то фала с такой то позиции) и начать опять передачу данных.
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
19.10.2015, 14:33 [ТС] | 36 |
а если я использую tcp написанный на Qt то в случае обрыва соединения нужно ловить сигнал disconnected()??
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
19.10.2015, 16:17 | 37 |
Ну это в референсе по компонентам Qt. но наверное примерно так. А там что у компонента ServerSocet в Object Inspector нет списка сигналов которые он посылает и нажав на сигнал разве нельзя создать обработчик?
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|
19.10.2015, 16:41 [ТС] | 38 |
Всмысле вы имеете ввиду посмотреть документацию по ServerSocket Qt какие есть сигналы да??
Добавлено через 10 минут
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
19.10.2015, 18:03 | 39 |
При обрыве соединения сокет тоже закрывается. А вот тут и можно определить это обрыв или штатное закрытие. Например предусмотреть в протоколе сигнал "конец связи" по которому сервер закрывает соеденение. Ну или смотреть по состоянию автомата приема в момент закрытия. Если автомат в режиме ожидания команды значит закрытие штатное. Если в другом режиме - (не получен конец буффера, не считано заданное количество байт, не завершена группа команд протокола и т.п.) - значит обрыв.
Добавлено через 6 минут Его нужно обрабатывать и на клиенте и на сервере. При этом у ClientSocket есть тот же набор событий включая OnDisconneted OnConnected и т.д. В Qt они может по другому как то называются но смысл именно такой, он из логики работы самих сокетов. Добавлено через 4 минуты Ну да. А вообще перед передачей туда нового файла неплохо бы спросить у сервера что там уже есть на эту тему. Да кстати а компонент HTTPServer в QT есть? А то пытаемся сейчас на коленке родить методы HEAD GET POST и PUT http протокола. Хотя у вас как понял основная масса данных бинарная, для них удобнее FTPServer, возможно частично с управлением через HTTP
0
|
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
|
|||||||||||
19.10.2015, 19:48 [ТС] | 40 | ||||||||||
Добавлено через 2 минуты
0
|
19.10.2015, 19:48 | |
19.10.2015, 19:48 | |
Помогаю со студенческими работами здесь
40
Модель передачи потока пакетов Что будет, если два разных потока попытаются отправить одновременно одному клиенту два разных пакета Сборка системника: варианты в разных ценовых категориях. Оптимизация передачи классов и методов и их обработки в разных модулях Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |