Отговори на тема  [ 12 мнения ] 
Комуникация през TCP сокети 
Автор Съобщение
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Нед Сеп 17, 2006 12:00 pm
Мнения: 450
Местоположение: Plovdiv
Мнение Комуникация през TCP сокети
Колеги, налага ми се да организирам комуникация между компютър (сървър) и едно устройство с линукс. До сега нещата ставаха с предаване на XML текст през сокета, но се оказа, че устройството не е достатъчно бързо да обработва всичките щуротий и сега трябва да ползвам нещо "просто" - да организирам някакви рамки (пакети) и полета в тях, за да предам командите с данните. Мастер-а е сървъра, а устройството - подчинения. Някой има ли опит с такъв обмен? Трябва ми нещо, което е проверено, че работи - в смисъл като организация и справяне с евентуални грешки.

_________________
for(;;)
DoFire();


Чет Окт 20, 2011 4:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Комуникация през TCP сокети
Хич не се разбира какво искаш.
XML парсера ли ти се бави или нещо друго?
Каква "рамка" очакваш? С един XML можеш да опишеш много неща и не вярвам да има някой дето да ти отговори твърдо и решително - "ей тъй става..". Справяне с грешки? TCP-то не ти ли стига?
До сега като си карал на XML кой се е справял с грешките?
Направи си един тест м/у XML и JSON парсер на лункското у-во и виж дали няма да е по - бързо и да те удволетвори. Все пак с JSON-а можеш да опишеш най различни структури от данни.


Чет Окт 20, 2011 8:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Комуникация през TCP сокети
Какво е това устройство дето търкаля линукс, а на XML се бави?

Има нещо гнило тука... освен XML-а да е голям (мегабайти?), ама то ако данните са много обработката винаги ще е бавна.
Ние работим с XML-и, но нямаме проблем със скоростта, въпреки че хардуерът е доста слаб. По-скоро проблем ни е паметта и заради това трябваше да си правим сами парсването и валидирането без да ползваме рекурсивни алгоритми...


Чет Окт 20, 2011 9:20 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Re: Комуникация през TCP сокети
Пробвай с http://en.wikipedia.org/wiki/Binary_XML или някой друг двоичен йерархичен стандарт. Щото явно ти трябва йерархия. Ако не ти трябва - въпроса е излишен.


Чет Окт 20, 2011 11:35 pm
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Нед Сеп 17, 2006 12:00 pm
Мнения: 450
Местоположение: Plovdiv
Мнение Re: Комуникация през TCP сокети
За кратки съобщения няма проблеми, но в случая се предават артикули с разни атрибути(име, цена и др.), които са много - примерно при 8000 артикула един по един и чакане на отговор дали е записан в базата данни на устройството. Всичкото отнема от порядъка на 20 минути и повече. Използвам Qt. За един артикул времето е около 100ms само обработката на XML-a.

_________________
for(;;)
DoFire();


Пет Окт 21, 2011 11:11 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Комуникация през TCP сокети
MidNighT_SpiRiT написа:
За един артикул времето е около 100ms само обработката на XML-a.


значи пращаш по един XML за всеки артикул?
В такъв случай 100ms е страшно много време, нещо не е както трябва ;-)
При не много сложна дефиниция, валидирането и парсване до обекти (от типа на STL) трябва да е поне 1MB/s. Нямам представа как работят Qt библиотеките, но в общия случай най-тежкото в алгоритмите е заемането на памет. Средно на 5-10 байта се прави malloc(), тъй че един отделен пул може доста да ускори нещата.
Другото е какво правиш с данните, евентуално записването може да се бави, но това пък няма нищо общо с XML-а.

При всички случаи те съветвам да не бягаш от XML-a. Той си се налага като стандарт за тоя сорт приложения. Ако трябва си пренапиши парсера, или поне виж как да го оптимизираш вместо да измисляш нови формати...


Пет Окт 21, 2011 12:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Комуникация през TCP сокети
Кой от всичките ХМЛ парсери на кют ползваш?
Да не си се метнал на xpath?


Пет Окт 21, 2011 1:24 pm
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Нед Сеп 17, 2006 12:00 pm
Мнения: 450
Местоположение: Plovdiv
Мнение Re: Комуникация през TCP сокети
Използвам QXmlStreamReader - чрез него съм си направил прост парсер. Като гледах днес вероятно повечето време се губи от копиране на данните от едно място на друго. Примерно QTcpSocket->readAll() връща QByteArray, който трябва да го преобразувам на QString, за да пратя към QXmlStreamReader. Данните, които не са числа са кодирани base64 и трябва да ги предам към функцията, която декодира и тн. Най-големият проблем е и картинката, която пращам (също кодирана base64) с размер 40-60kB.

_________________
for(;;)
DoFire();


Пет Окт 21, 2011 3:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Комуникация през TCP сокети
Не го преобразувай до QString. На QXmlStreamReader конструктура приема и QByteArray.


Пет Окт 21, 2011 4:05 pm
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Нед Сеп 17, 2006 12:00 pm
Мнения: 450
Местоположение: Plovdiv
Мнение Re: Комуникация през TCP сокети
Конструктора да, но в случая QXmlStreamReader::addData(String&) си иска само QString

_________________
for(;;)
DoFire();


Пет Окт 21, 2011 5:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Комуникация през TCP сокети
:D
Ми не викай addData. След като си създал класа и си му задал референция към QByteArray не е нужно да викаш addData.


Пет Окт 21, 2011 5:29 pm
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Нед Сеп 17, 2006 12:00 pm
Мнения: 450
Местоположение: Plovdiv
Мнение Re: Комуникация през TCP сокети
Мерси michev, въпреки, че не тръгва както би трябвало да е, т.е. да му задам девайс и да си чете от там. Ползвам пак addData(), но видях, че можело да се подава const char* указател. Процесорът е ARMG45 на 400MHz. Като цяло пак е бавно, но малко по-бързо от преди.

_________________
for(;;)
DoFire();


Вто Окт 25, 2011 3:04 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 6 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни