Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.11;
Скачать: CL | DM;

Вниз

Взаимодействие со службой по TCP   Найти похожие ветки 

 
_alex__   (2009-07-15 22:08) [0]

Начал реализовывать задачу, в которой служба должна общаться с GUI-приложением в обоих направлениях. Т.е. GUI может посылать определенные команды службе, та их принимать. В свою очередь, в произвольные моменты служба должна отправлять GUI-приложению определенные данные (статистику). Довольно часто.

Раньше подобные задачи делал на Named Pipes. Теперь, в силу условий, нужно сделать на сокетах. С Инди TIdTCPClient, TIdTCPServer почти не работал ранее. Есть несколько глупых вопросов:

1. Насколько надежны эти компоненты? Приложение должно работать 24/7/365.

2. Как я понял, сервер принимает сообщения от клиента в IdTCPServerExecute. Я могу, путем обращения к списку активных потоков соединений получить соединение с GUI-приложением и отправить туда данные в произвольном месте программы?  В каком потоке пойдут эти данные?

3. Насколько будет надежна такая двусторонняя связь в одном канале? Будут ли тормоза?

4. При приеме данных в клиенте нужно создавать отдельный поток на чтение данных или достаточно по таймеру делать read...?

5. Могут ли пакеты, отправляемые службой, склеиваться?

6. Не лучше ли в GUI и службе реализовать и клиент и сервер?

В примере чата на Инди реализовано как раз взаимодействие в одном канале. Но возникают сомнения в надежности. Данные у меня пойдут сплошным потоком, а клиент должен будет успеть сказать службе "свое слово".

Заранее спасибо за ответы!


 
Вариант   (2009-07-16 06:53) [1]


> _alex__   (15.07.09 22:08)


На 1 и 2  - не знаю Indy, не работал.

3 - Связь надежна (хотя каков критерий надежности?), если надежен канал передачи данных, то же относится и к тормозам. NamedPipes при работе в сети так же используют этот же физический канал связи.
4 - Вариант с чтением по таймеру на мой взгляд "не камильфо". Насчет отдельного потока - это зависит от того в каком режиме ты работаешь. Так как ты выбрал Indy, то совет  для этой библиотеки не дам. А если абстрагироваться от библиотеки и считать, что мы просто работаем с сокетом, то при блокирующем сокете (и не OVERLAPPED I/O) и при независимой по логике твоего приложения (полный дуплекс) работе каналов чтения и передачи -  надо создать отдельный поток на чтение и на запись. В случае использования неблокирующих сокетов и/или перекрытого вывода вывода создавать отдельный поток для чтения нет особого смысла.
5 - Да. TCP -это просто сплошной поток, река.
6 - Нет, не вижу смысла.   Если у тебя есть аргументы за - расскажи.


> В примере чата на Инди реализовано как раз взаимодействие
> в одном канале. Но возникают сомнения в надежности. Данные
> у меня пойдут сплошным потоком, а клиент должен будет успеть
> сказать службе "свое слово".


Для тебя  канал связи (в данном случае сокет) - это дуплексный канал, клиент может передавать независимо от чтения.


 
Сергей М. ©   (2009-07-16 08:34) [2]


> 1. Насколько надежны эти компоненты?


Вполне себе нормальные компоненты, не хуже других в плане надежности.


> В каком потоке пойдут эти данные?


В дополнительном, а именно в том в котором вызывается метод-обработчик IdTCPServerExecute


 
_alex__   (2009-07-16 10:45) [3]

Спасибо большое!
Почему спросил про надежность - много читал постов, что неблокирующие TServerSocket, TClientSocket достаточно глючны. И со сложной логикой программирования. Т.к. самому не охота возиться с апи winsock, решил попробовать инди.

Еще два уточнения:
1. Если клиент вызывает метод disconnect, на сервере при этом автоматически удаляется указатель на его поток из списка потоков? Т.е., могу ли я нарваться на несуществующий поток, если клиент вдруг завершил работу (в т.ч. и аварийно)?

2. Как пакеты могут склеиваться, если пока клиент не прочитает очередную посылку сервера, последний не сможет отправить следующую. В этом же принцип синхронной передачи? Или я что-то упустил? В моем понимании, клиент будет получать от сервера по одному пакету (в моем случае, это короткая строка-команда) за одну операцию readln. Поправьте меня, если я не прав.


 
Вариант   (2009-07-16 11:43) [4]


> _alex__   (16.07.09 10:45) [3]



> 2. Как пакеты могут склеиваться, если пока клиент не прочитает
> очередную посылку сервера, последний не сможет отправить
> следующую. В этом же принцип синхронной передачи? Или я
> что-то упустил? В моем понимании, клиент будет получать
> от сервера по одному пакету (в моем случае, это короткая
> строка-команда) за одну операцию readln. Поправьте меня,
>  если я не прав.


TCP не гарантирует сохранения границы пакетов. Пакеты могут фрагментироваться, склеиваться... Восстановление границ пакетов лежит на твоем приложении или в некоторых случаях на библиотеке, которую используешь. ReadLn в Indy -возможно как раз вариант библиотеки, которая возвращает строку, ограниченную терминатором, то есть фактически восстанавливает границы пакета.  Но по Indy я не спец.


 
Сергей М. ©   (2009-07-16 11:47) [5]


> неблокирующие TServerSocket, TClientSocket достаточно глючны


Не более глючны чем IdTCPServer/Client


> со сложной логикой программирования


Это да, неблокирующий режим будет посложнее.
Но если уж сравнивать с IdTCPServer/Client, то сравнению подлежит блокирующий режим, поскольку IdTCPServer/Client предоставляют только блокирующий режим.


> Если клиент вызывает метод disconnect, на сервере при этом
> автоматически удаляется указатель на его поток из списка
> потоков?


Нет.


> могу ли я нарваться на несуществующий поток


При желании можно грабли где-угодно найти)


> пока клиент не прочитает очередную посылку сервера, последний
> не сможет отправить следующую


Это почему же не может ? Может, и ничто этому не мешает.

TCP - поточно-ориентированный протокол.


 
_alex__   (2009-07-16 13:17) [6]

сделал тестовый пример, многое прояснилось. К примеру, то что сервер может отправить сколько угодно сообщений клиенту. Они все помещаются в очередь. А клиент потом может сколько угодно "расхлебывать" эту кучу. Все пришло в том же порядке и без склейки. А эта очередь где создается? На клиенте?
Просто сервера уже нет, а сообщения все читаются


 
Сергей М. ©   (2009-07-16 13:32) [7]


> К примеру, то что сервер может отправить сколько угодно
> сообщений клиенту


Равно как и наоборот.
После того как соединение между клиентом и сервером успешно установлено, понятия "клиент" и "сервер" перестают существовать - с этого момента существует канал инф.обмена между двумя партнерами по этому соединению, эти партнеры равноправны, каждый из них вправе как передавать партнеру, так и принимать от партнера инф.поток.


> эта очередь где создается?


Очередей на самом деле две - одна на стороне передатчика (очередь передачи), другая на стороне приемника (очередь приема).


> сервера уже нет, а сообщения все читаются


Они выбираются приемником из очереди приема.
Как только та опустеет в результате "расхлебывания", очередная попытка чтения приведет к исключению.


 
_alex__   (2009-07-16 14:04) [8]

Спасибо за информацию!
Достаточно все прозрачно и проще, чем Pipes. Микрософт навернуло, конечно, там... Это и понятно - более высокоуровневое взаимодействие с элементами безопасности. Жалко, что все завязано на двух портах, которые, как правило, закрывают в целях безопасности.

Появятся вопросы, спрошу еще! Спасибо! :)


 
_alex__   (2009-07-16 17:09) [9]


> > В каком потоке пойдут эти данные?
>
>
> В дополнительном, а именно в том в котором вызывается метод-
> обработчик IdTCPServerExecute


Что-то эксперимент показал, что данные от сервера уходят в основном потоке. Блокируешь основной поток тяжелым процессом, данные перестают уходить. Это нормально?


 
Сергей М. ©   (2009-07-16 17:13) [10]

Нет, не нормально.


 
Anatoly Podgoretsky ©   (2009-07-17 09:33) [11]

> _alex__  (16.07.2009 17:09:09)  [9]

Это нормально, если тебе нужна серилиазация.


 
_alex__   (2009-07-17 10:31) [12]

Скорее всего, отправлять данные от сервера буду в отдельном потоке (так и так получится). Наличие очередей у приемника и отправителя здорово упрощает задачу. Пусть сервер шлет сколько угодно и когда угодно. Клиент так же в потоке все примет и обработает. На тесте нормально все проходит.


 
Dennis I. Komarov ©   (2009-07-17 15:27) [13]

Задачу ГУИ не знаю, но, как правило, это управление, конфигурирование, наблюдение за службой. Я общаюсь с ней по HTTP (суйчас так многие ус-ва конфигурируются)
Что имеем: клиент есть на любой машине и его писать не надо, нас даже не волнует платформа клиента, пишем небольшую часть на сервере и все

Удачи...

ЗЫ
 Делал на TTcpServer...


 
_alex__   (2009-07-17 20:58) [14]


> Я общаюсь с ней по HTTP (суйчас так многие ус-ва конфигурируются)


Время десктопов проходит... :)
К сожалению, сильных знаний html нет. Да и вебморду надо нарисовать красивую еще суметь.
GUI кроме отправления команд будет и отображать результаты работы службы.


 
Dennis I. Komarov ©   (2009-07-20 10:18) [15]


> _alex__   (17.07.09 20:58) [14]

Опять повторюсь, я не знаю вашей задачи, но:
1. вебморду рисовать - это уже дело десятое.
2. > кроме отправления команд будет и отображать результаты работы
> службы.

не вижу тут проблем



Страницы: 1 вся ветка

Текущий архив: 2011.12.11;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.011 c
1-1276603042
AIV2104
2010-06-15 15:57
2011.12.11
DCPcrypt для Delphi 7 и 2009 не ставиться из-за rtl.bcp


2-1314473437
Gu
2011-08-27 23:30
2011.12.11
данные в ресурсах


15-1313501980
TInd
2011-08-16 17:39
2011.12.11
Работа с TIFF.


4-1242382646
Игорь
2009-05-15 14:17
2011.12.11
Функция IsProcessInJob в Windows 2000


15-1313681077
SQLEXPRESS
2011-08-18 19:24
2011.12.11
как админить бд mssql при режиме 24/7