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

Вниз

TSimpeObjectBroker - как переключить клиента на другой сервер?   Найти похожие ветки 

 
tytus   (2007-11-14 11:35) [0]

Доброго дня всем.
Ситуация следующая. Запущено два сервера-приложений на разных компах. Как мне переключить клиента с одного сервера на другой?
Реализован callback для отправки клиенту сообщений с сервера. Вот допустим посылаю клиенту сообщение с именем сервера (имя компа в сети) и клиент должен отключиться от текущего сервера-приложений и законнектиццо на другом компе. Использую TSockectConnection + TSimpleObjectBroker.
В списке серверов брокера всего два итема (пока что...)
Как правильно отключать сервера в брокере.
Servers[i].Enabled:=false - не помогает.


 
Сергей М. ©   (2007-11-14 11:50) [1]


> не помогает


Чему не помогает ? Отключению или подключению клиента ?
И что вообще значит "не помогает" ?


 
tytus   (2007-11-14 13:24) [2]

>Сергей М. ©   (14.11.07 11:50) [1]
делаю так.
В обработчике сообщений от сервера (на клиенте) пишу:
Вначале отключаю клиента.
Connect1.Close;//Connect1 - TSocketConnection SOB1 - TSimpleObjectBroker
Затем в брокере делаю недоступными все Servers  кроме того, свойство ComputerName которого совпадает ст принятым в сообщении
with SOB1 do
for i:=0 to Servers.Count-1 do
 begin
   if UpperCase(Servers[i].ComputerName)<>ApperCase(ServerMessage)then
     Servers[i].Enabled:=false
   else
     Servers[i].Enabled:=true;
 end;
Вот и все. //ServerMessage - строка от сервера
Затем заново подключаюсь
Connect1.Open;
и ловлю "No Servers available" , хотя сервера запущены...
Ежели в DesignTime отключать сервера по одному - то все работает...


 
Сергей М. ©   (2007-11-14 13:32) [3]


> В обработчике сообщений от сервера .. отключаю клиента


Такая логика, мягко говоря, не есть гут.

В колбэке посылай асинхронно предопределенное сообщение осн.потоку, при обработке которого собссно и выполняй дисконнект/реконнект и прочие манипуляции с брокером.


 
tytus   (2007-11-14 13:43) [4]

>Сергей М. ©   (14.11.07 13:32) [3]
если я правильно понял - то так и делаю.
вот фрагмент модуля колбека:
const
 CLIENT_MESSAGE=WM_USER+144;

procedure TClientCallBack.ClSend(const AMessage: WideString);
var
 s:WideString;
begin
s:=AMessage;
PostMessage(MainFm.Handle,CLIENT_MESSAGE,WParam(PChar(s)),0);
end;
где MainForm - собственно главная форма .
а вот что в самой главной форме:
const
 CLIENT_MESSAGE=WM_USER+144;
private
procedure CLIENTMESSAGE(var Message:TMessage);message CLIENT_MESSAGE;
затем в implementattion пишу:
procedure TMainFm.CLIENTMESSAGE(var Message:TMessage);
...
begin
SrvClientMessage:=WideString(Message.WParam);
ну а далее Вы знаете....
Получается, что если не делать PostMessage, то сервер подвиснет на время обработки сообщения на клиенте, а так - вроде правильно, и сервер никого не ждет...


 
Сергей М. ©   (2007-11-14 13:46) [5]


> если не делать PostMessage


Кто сказал что не делать ? Делать ! Именно об этом и идет речь !


 
tytus   (2007-11-14 13:59) [6]

>Сергей М. ©   (14.11.07 13:46) [5]
Да так и делаю... мы немного отвлеклись от темы вопроса.
Короче, проведя експеременты, подводя итог, могу сказать след.:
кампанент - TSimpleObjectBroker - для ленивых.
Тоесть - кинул его на форму, прописал сервера - и забыл. В нем даже свойство LoadBalanced ужо установлено в True.
Кстати об сем свойстве. Когда оно тру, то простой Connect1.Open работает на ура. Ежели его установить в фальш, то простым перебором в цикле i:=0 to Servers.Count-1 if not Servers[i].HasFailed ... ничего не добьешся.
Конечно, свое назначение он оправдывает - при подключении соединяется с доступным сервером приложений. А мне нужно с одного сервака переключить клиентов на другой.... короче с брокером не разрулил, и
юзаю простой TStringlist и циклом в блоке try..except..end пытаюсь соединится с доступным сервером, устанавливая принудительно
Connect1.Host:=Serverslist[i]. Вот так.
Исче раз - о брокере - все выше сказанное ИМХО.
Возможно не асилил...


 
Сергей М. ©   (2007-11-14 14:10) [7]


> tytus   (14.11.07 13:59) [6]


Сырой он, TSimpleObjectBroker ..
Он и писался-то Борландом скорее как демо.

Проще не искать там глюки, а сделать своего наследника TCustomObjectBroker, где реализовать требуемую логику самостоятельно.


 
tytus   (2007-11-14 14:27) [8]

>Сергей М. ©   (14.11.07 14:10) [7]
ну вот, мои изыскания и заключения подтвердились.
Спасбо за участие в конференции.
Наследника делать не буду - потому как времени нету, нужно довести до ума трехзвенку...



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

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

Наверх




Память: 0.46 MB
Время: 0.033 c
15-1207571045
TIF
2008-04-07 16:24
2008.06.22
И снова про полупрозрачность :-(((


15-1210231595
@!!ex
2008-05-08 11:26
2008.06.22
Использование Delphi Dll на MSVC++


2-1211652384
programmer90
2008-05-24 22:06
2008.06.22
Free Pascal на Delphi -"поймать и удержать"


2-1211990948
StiTch
2008-05-28 20:09
2008.06.22
Блок Схема


1-1194606499
misha_gr
2007-11-09 14:08
2008.06.22
ParamStr()





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский