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

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

Вопрос по компоненту IdTCPClient [D7]


dreamse ©   (2007-04-18 11:53:00) 

Вопрос в следующем :

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

есть клиент на нём установлен IdTCPClient1
Так вот нужно подключиться к серверу и ждать какого нибудь события от него или от программы. Если сервер отвалился то запускаем таймер который через каждые 5 минут пытается присоединиться к серверу если соединение произошло таймер выключается, если нет то пытается каждые 5 сек присоединиться.

Вопрос. Как в компоненте IdTCPClient1 отследить момент когда сервер отвалился ? т.е произошел разрыв связи ?

SocketConnected и  SocketDisconnected какую то чушь показывают и SocketDisconnected не реагирует вообще никак на отваливания сервера.

Как решить этот вопрос ?

p.s в старых компонентах стандартных всё было ништяк и просто. Но политика компании такова что заставляют использовать indy
помогите решить вопрос.


DVM   (2007-04-19 10:37:00) [1]

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


DVM   (2007-04-19 10:35:00) [2]


> Зачем все это? у данной компоненты есть метод OnDisconnected,
>  в нем  и можно запустить процедуру нового коннекта к серверу!
> !!

Эти события не генерируются при разрыве соединения со стороны сервера.


> Технология клиен/сервер работает по принципу "клиент подключился
> - отправил запрос - сервер ответил - клиен получил ответ
> - отключился".

Это скорее для HTTP протокола. Не всегда так должно быть. Клиент может висеть подключенным к серверу годами. Типичный пример - Telnet.


Wolchonok29   (2007-04-19 10:11:00) [3]


> SocketConnected и  SocketDisconnected какую то чушь показывают
> и SocketDisconnected не реагирует вообще никак на отваливания
> сервера.

Зачем все это? у данной компоненты есть метод OnDisconnected, в нем  и можно запустить процедуру нового коннекта к серверу!!!


Плохиш   (2007-04-18 12:37:00) [4]


> dreamse   (18.04.07 12:18) [5]

Технология клиен/сервер работает по принципу "клиент подключился - отправил запрос - сервер ответил - клиен получил ответ - отключился". Что вы там собираетесь ждать и какое соединение постоянно держать не понятно. Даже при сессионости не надо ни каких соединений открытых держать, существует уникальный идентификатор сессии.


umbra   (2007-04-18 12:20:00) [5]


> получается что постоянно нужно делать проверку

да не надо ничего делать, Reindeer Moss Eater © совершенно прав. Если при чтении возникла ошибка - запускайте свой таймер.


dreamse   (2007-04-18 12:18:00) [6]

получается что постоянно нужно делать проверку :( Не очень приятно. Но понятно.
Спасибо всем. Буду дальше решать.


Reindeer Moss Eater   (2007-04-18 12:16:00) [7]

Как мне ужнать что сервер начал передавать данные если у меня соединения с ним оборвалось в момент ожидания ?

Чтобы принять от сервера данные, передача которых может начаться в любой момент - надо вызвать метод чтения данных.
Метод синхронный.
Вот и все.
А если это глупо, а ты такой умный, то чего здесь вопросы задаешь?
:)


umbra   (2007-04-18 12:14:00) [8]

try
 IdTCPClient1.IoHandler.WriteDirect(ToBytes('Ты еще жив?'));
on E:EIdConnClosedGracefully
 ShowMessage('Пациент скорее мертв, чем жив');
end;


dreamse   (2007-04-18 12:08:00) [9]

Да не глупо как то.
Клиент не знает подключен ли он к серверу или нет. Как мне ужнать что сервер начал передавать данные если у меня соединения с ним оборвалось в момент ожидания ?

В старых TClienSocket всё прекрасно работало при отваливании сервера вызывалось событие дисконекта.

что делать ?


Reindeer Moss Eater   (2007-04-18 12:02:00) [10]

Если ты ничего не читаешь с сервера, то тебе по барабану, жив он или нет.
А если читаешь, и сервер помер, то получишь исключение.


Наверх

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