![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по компоненту 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]Если ты ничего не читаешь с сервера, то тебе по барабану, жив он или нет.
А если читаешь, и сервер помер, то получишь исключение.