Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Вниз

Взаимодействие Indy серверов   Найти похожие ветки 

 
pavel_guzhanov   (2004-11-01 13:32) [0]

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


 
Reindeer Moss Eater ©   (2004-11-01 13:53) [1]

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


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

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


 
Reindeer Moss Eater ©   (2004-11-01 14:07) [3]

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


 
pavel_guzhanov   (2004-11-01 14:14) [4]

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


 
Reindeer Moss Eater ©   (2004-11-01 14:41) [5]

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


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

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


 
Reindeer Moss Eater ©   (2004-11-01 15:11) [7]

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

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

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

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

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


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

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

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

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


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

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


 
Reindeer Moss Eater ©   (2004-11-01 15:28) [9]

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

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


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

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


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


> pavel_guzhanov



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


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


 
Reindeer Moss Eater ©   (2004-11-01 15:55) [12]

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

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

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


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

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

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

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


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

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

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


 
Digitman ©   (2004-11-01 16:34) [15]


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


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


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


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

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

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


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

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


 
Reindeer Moss Eater ©   (2004-11-01 16:39) [17]

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

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


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

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


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

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-02 11:34) [20]

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



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

Форум: "Сети";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.035 c
3-1103207104
}|{yk
2004-12-16 17:25
2005.01.23
Как так пройтись по набору выделенных записей,


1-1104995714
Stanislav
2005-01-06 10:15
2005.01.23
Форма из DLL


1-1105385578
Anonimus
2005-01-10 22:32
2005.01.23
Вопрос по TListView


14-1104137601
Homa_Programer
2004-12-27 11:53
2005.01.23
Копия экрана


1-1105369834
DK
2005-01-10 18:10
2005.01.23
Как остановить выполнение метода





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский