Russian Qt Forum
Ноябрь 11, 2024, 04:35
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
XML
>
Передача XML по сети
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Передача XML по сети (Прочитано 15578 раз)
Fregloin
Супер
Offline
Сообщений: 1025
Передача XML по сети
«
:
Август 08, 2011, 08:55 »
Как можно динамически формировать XML и передавать/принимать их по сети?
Желательно без QDataStream, так как клиент написан на Qt, а сервер на чистом Си под лины.
Задача, сформировать небольшой xml документ, отправить на сервер, сервер возвратит тоже небольшой xml док, после чего идёт обмен бинарными данными.
Записан
Странник
Гость
Re: Передача XML по сети
«
Ответ #1 :
Август 08, 2011, 15:05 »
способов вагон. я предпочитаю использовать QXmlStreamWriter. можно сначала сформировать документ в QByteArray-буфер и затем отправить его целиком через QTcpSocket, а можно сразу в QTcpSocket писать. подробности в документации на QXmlStreamWriter.
Записан
BigHom
Гость
Re: Передача XML по сети
«
Ответ #2 :
Ноябрь 06, 2012, 08:58 »
А как принимать xml-документ , как понять , что целиком принят документ , что больше не будет продолжения передачи? Так как приняв часть, обрабатывается только принятая часть, а послав продолжение , то так как нет началА XML-документа , то продолжение как xml-документ не воспринимается?!
Возможно же, передача по частям xml-документа , f не обязательно целиком?!
Записан
Bepec
Гость
Re: Передача XML по сети
«
Ответ #3 :
Ноябрь 06, 2012, 10:21 »
xml - теговый. Если пришёл тег конца, значит передача xml закончена. Вроде всё просто.
Записан
BigHom
Гость
Re: Передача XML по сети
«
Ответ #4 :
Ноябрь 06, 2012, 10:26 »
пришёл файл по сети - даю на обработкку sax-анализатору, всё работает , идёт по веткам, но не доходит до тэга конца, так как ещё не поступил. Потом по сети приходит 2-й кусок - даю на обработку - но продолжение не воспринимается как xml-документ , так как нет тэга начала.
То есть получается , что sax-анализатору можно давать только целиковый xml-документ? Как продолжить обработку с прерванного места , есть ли возможность?
Записан
Sancho_s_rancho
Гость
Re: Передача XML по сети
«
Ответ #5 :
Ноябрь 06, 2012, 10:51 »
Не придумывайте трудностей. Шлите небольшие xml.
Записан
Patrin Andrey
Гость
Re: Передача XML по сети
«
Ответ #6 :
Ноябрь 06, 2012, 11:50 »
А небольшие это сколько? Кто даст гарантию, что "небольшой" не прилитит "маленькими" частями?
Записан
mutineer
Гость
Re: Передача XML по сети
«
Ответ #7 :
Ноябрь 06, 2012, 11:58 »
Цитата: Patrin Andrey от Ноябрь 06, 2012, 11:50
А небольшие это сколько? Кто даст гарантию, что "небольшой" не прилитит "маленькими" частями?
Передать перед документом его размер и не отдавать документ парсеру, пока он весь не придет
Записан
Bepec
Гость
Re: Передача XML по сети
«
Ответ #8 :
Ноябрь 06, 2012, 12:02 »
Зачем такие сложности? Принимать данные до тех пор, пока не примется завершающий тег xml. После отдаёшь парсеру и врубливаешь бинарные данные куда угодно.
Записан
mutineer
Гость
Re: Передача XML по сети
«
Ответ #9 :
Ноябрь 06, 2012, 12:03 »
То есть понять какой тег завершающий и дождаться его, это проще, чем тупо считать размер полученных данных?
Записан
Patrin Andrey
Гость
Re: Передача XML по сети
«
Ответ #10 :
Ноябрь 06, 2012, 12:10 »
Цитата: mutineer от Ноябрь 06, 2012, 11:58
Цитата: Patrin Andrey от Ноябрь 06, 2012, 11:50
А небольшие это сколько? Кто даст гарантию, что "небольшой" не прилитит "маленькими" частями?
Передать перед документом его размер и не отдавать документ парсеру, пока он весь не придет
Ну да. При таком подходе нет разницы "большой" документ или "небольшой". А на сколько я понял, передавать "небольшой" и предлагают для того, чтобы не передавать размер.
Записан
Bepec
Гость
Re: Передача XML по сети
«
Ответ #11 :
Ноябрь 06, 2012, 12:20 »
Помоему да, проще. Особенно с учётом того, что xml формируется им же.
Хотя нет, не так - это скорее два равнозначных метода решения проблемы. При этом подходе к тому же помехоустойчивость маленькая в любом случае
Записан
Sancho_s_rancho
Гость
Re: Передача XML по сети
«
Ответ #12 :
Ноябрь 06, 2012, 15:33 »
1. Контролировать, что пришли все байтики должен протокол прикладного уровня(в простейшем случае сочините заголовок фиксированной длины в котором хранится инфа о размере xml данных). Причем это делать обязательно независимо от того, сколько байт или терабайт передается и что пересылается(xml или картинка с голой тетёй). Проще взять TCP, там уже есть гарантия доставки и отбрасывание повторяющихся пакетов. Если очень хочется, то можно хоть хеш каждого xml файла считать.
2. Небольшой размер xml я рекомендовал вместо загадочного частичного парсинга.
Записан
mutineer
Гость
Re: Передача XML по сети
«
Ответ #13 :
Ноябрь 06, 2012, 16:21 »
Цитата: Sancho_s_rancho от Ноябрь 06, 2012, 15:33
2. Небольшой размер xml я рекомендовал вместо загадочного частичного парсинга.
И какого размера должен быть этот xml, чтобы он гарантировано пришел одним куском?
Записан
Sancho_s_rancho
Гость
Re: Передача XML по сети
«
Ответ #14 :
Ноябрь 07, 2012, 08:56 »
Цитата: mutineer от Ноябрь 06, 2012, 16:21
Цитата: Sancho_s_rancho от Ноябрь 06, 2012, 15:33
2. Небольшой размер xml я рекомендовал вместо загадочного частичного парсинга.
И какого размера должен быть этот xml, чтобы он гарантировано пришел одним куском?
Я не знаю термина "один кусок". UDP пакет - это кусок? Так вот, датаграмма для udp ТЕОРЕТИЧЕСКИ может достигать 65535 вычесть длину заголовка. Все зависит от сетевого стека ОС. На практике не один человек в здравом рассудке на это полагаться не будет.
Вот что пишут Qt-шники
Datagrams are always written as one block. The maximum size of a datagram is highly platform-dependent, but can be as low as 8192 bytes. If the datagram is too large, this function will return -1 and error() will return DatagramTooLargeError.
Sending datagrams larger than 512 bytes is in general disadvised, as even if they are sent successfully, they are likely to be fragmented by the IP layer before arriving at their final destination.
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...