Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Взаимодействие Indy серверов [D7, Win2k, WinXP]


pavel_guzhanov ©   (2004-11-01 13:32:00) 

Здравствуйте!
Вот такой вопрос: На форме находятся два IdTCPServer, называю я их InputServerи CommandServer. Мне надо сделать так, чтобы при поступлении ккоманды извне в InputServer, CommandServerотправил свою команду к подключенному клиенту. Подскажите, как это можно реализовать?
Спасибо.


pavel_guzhanov   (2004-11-02 11:34:00) [1]

Спасибо, попробую


alienserg   (2004-11-02 00:57:00) [2]

pavel_guzhanov   (01.11.04 16:52) [18]

делай так:
Посмотри пример IndyDemos\Chat\Server
там создается список экземпляров подсоединенных клиентов.
Сделай то же самое для твоего CommandServer.
Когда тебе надо отправить что-то клиенту, подсоединенному к CommandServer, то по приходу команды в InputServer ищи нужного клиента в списке, доставай оттуда его TIdPeerThread и делай
TIdPeerThread(CommandClientThread).Connection.Writeln('сам_знаешь_что');
Только помни, что исполнение всего этого дела будет в контексте вызывающего треда и тебе надо самому позаботиться о том, чтобы никто другой с данным CommandClientThread не работал в этот же самый момент.
Критические секции расставляй.
Есть и другое, более трудоемкое, но производительное решение: всю отсылочную работу клиентам CommandServer переложить на пул специализированных тредов-отсыльщиков. Они должны будут сканировать промежуточный стек пришедших сообщений и отсылать их кому надо вышеописанным способом.


pavel_guzhanov   (2004-11-01 16:52:00) [3]

Очень жаль. Спасибо за исчерпывающий ответ))))


Reindeer Moss Eater   (2004-11-01 16:39:00) [4]

Можно ли заставить сервер послать клиенту строку из процедуры, не имеющей отношения к этому серверу?

Про это в основах ООП написано.
Нельзя написано.


pavel_guzhanov   (2004-11-01 16:34:00) [5]

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


Digitman   (2004-11-01 16:34:00) [6]


> информация, приходящая в порт анализируется на длину сообщения


ничего не имею против ... нехай себе анализируется .. к саюжу это отношения не имеет


> команды из командной строки однозначно короче, и не смогут
> обрабатываться


чушь какая-то

есть понятие "прикладной протокол инф.обмена между сервером и клиентом", вот этим понятием и оперируй

пока нам хдесь абсолютно неясно, что он из себя представляет в твоей программе для каждого сервера


Reindeer Moss Eater   (2004-11-01 16:11:00) [7]

Это вольный пересказ техзадания.

И в нем, в техзадании говорится о двух экземплярах TidTCPServer?


pavel_guzhanov   (2004-11-01 16:09:00) [8]

это не бред. Это вольный пересказ техзадания. не получится сделать один сервер, я уже все варианты перебрал, ну или очень многие варианты

> какому клиенту ? у сервера может быть более одного активного
> клиента ...

да, может быть, но все они должны быть подключены к одному порту. Но информация, приходящая в порт анализируется на длину сообщения, а команды из командной строки однозначно короче, и не смогут обрабатываться... Поэтому используется 2 сервера


Reindeer Moss Eater   (2004-11-01 15:55:00) [9]

Ну что за бред?
При чем здесь АТС и чья-то командная строка?

Два TidTCPServer'а в одном процессе - излишество и извращение.
Один и все.

InputServer завязан с АТС на конкретном порту,
Да хоть на законкретном.


Digitman   (2004-11-01 15:53:00) [10]


> pavel_guzhanov



> CommandServer отправил свою команду к подключенному клиенту


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


pavel_guzhanov   (2004-11-01 15:44:00) [11]

не могу я оставить один сервер, ибо программа получает информацию из сетевого устройства (Офисная АТС). Для получения этой информации используется InputServer. В процедуре InputServerExecute эта информация направляется в базу данных.
CommandServer используется для управления программой из командной строки. Так вот, при получении из командной строки CommandServer'ом команды 'InLog' Информация с АТС должна направляться не в базу, а в командную строку, из которой пришла команда, т.е. должна отправляться CommandServer'ом. Так как InputServer завязан с АТС на конкретном порту, то управлять программой через этот же порт - мне кажется будет некорректно.
Я не знаю, как еще можно все это описать подробнее и понятнее?


Reindeer Moss Eater   (2004-11-01 15:28:00) [12]

Я пока конкретного вопроса не видел.

А для начала совет:
Оставь один сервер.


pavel_guzhanov   (2004-11-01 15:21:00) [13]

Эти серверы работают на разных портах, и выполняют разные задачи, которые по времени могут пересекаться. Поэтому используется 2 сервера.

> Кто тебе говорил, что делать это надо из метода Execute
> InputServera?

когда в InputServer приходит запрос, выполняется метод Execute, и в зависимости от результатов обработки полученного запроса нужно, чтобы CommandServer послал строку. Мне кажется, что это надо делать именно из процедуры InputServerExecute. Если я не прав, то подскажи, как это можно сделать по другому.


> Метод отсылающий строку данных тебе уже дан.

Этот метод я знаю, а вот по моему КОНКРЕТНОМУ вопросу пока ответа не получил...


Reindeer Moss Eater   (2004-11-01 15:11:00) [14]

Мне нужно сделать,

Нужно сделать - делай.
Метод отсылающий строку данных тебе уже дан.

Я как раз спрашиваю, как мне из процедуры InputServerExecute сделать, чтобы CommandServer послал строку клиенту

Кто тебе говорил, что делать это надо из метода Execute InputServera?
Либо пальцем покажи, либо перестань повторять одно и то же.

Кстати.
Нафига тебе потребовалось городить огород из ДВУХ компонентов сервера в ОДНОМ приложении?
Один единственный справится с этим делом не хуже, если не лучше.


pavel_guzhanov   (2004-11-01 14:55:00) [15]

Процедура InputServerExecute. Мне нужно сделать, чтобы во время выполнения ЭТОЙ процедуры CommandServer послал строку. Если в процедуре InputServerExecute написать AThread.Connection.Writeln('Одна строка клиенту');, то это будет команда для InputServer. Я как раз спрашиваю, как мне из процедуры InputServerExecute сделать, чтобы CommandServer послал строку клиенту


Reindeer Moss Eater   (2004-11-01 14:41:00) [16]

А я разве сказал, что это код для InputServer?


pavel_guzhanov   (2004-11-01 14:14:00) [17]

Если я напишу так в процедуре TForm1. InputServerExecute(AThread: TIdPeerThread), то эту самую строку клиенту пошлет InputServer, а мне надо, чтобы ее послал CommandServer. Клиенты у этих серверов разные.


Reindeer Moss Eater   (2004-11-01 14:07:00) [18]

AThread.Connection.Writeln('Одна строка клиенту');


pavel_guzhanov   (2004-11-01 14:05:00) [19]

Не знаю, Возможно так будет понятнее: В InputServerприходит запрос из программы-клиента. При этом происходит событие InputServerExecute(). Есть процедура обработки этого события TForm1.InputServerExecute(AThread: TIdPeerThread). Мне надо сделать в этой процедуре так, чтобы CommandServerв этот момент послал какое-либо сообщение своемуклиенту. Я прошу подсказать, вероятно, только одну строку, которая это реализует, так что программу мне писать не надо.
Заранее спасибо


Reindeer Moss Eater   (2004-11-01 13:53:00) [20]

тебе программу написать, или есть внятный вопрос?


Наверх

Титульная страница Поиск, карта сайта Написать письмо