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

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

Событие OnDisconnect [D5, Win95/98]


Dimich1978 ©   (2002-08-26 11:43:00) 

Я как понял это событие происходит один раз и по вине самого приложения или по вине сервера(дисконнект вообщем). Но вот вопрос если у меня рухнул сервер (подвис сам, или винда) что привело к перезагрузке компа. ТО клиент должен подконнектится сам после того как сервер заново запустится. Как это можно реализовать.


VID   (2002-08-29 00:26:00) [1]

Кстати, забыл сказать, что в Client.onConnect где нибудь среди первых строчек кода надо написать AllowAutoReconnect := true. Таким образом состояние механизма реконнекта клиента будет приведено к начальному - т.е. клиент готов включить реконнект, в случае аварийного отключения


VID   (2002-08-29 00:21:00) [2]

TO Dimich 1978:
для начала, в событии Client.onError
напиши :
client.Socket.Disconnect(Socket.SocketHandle);
- одни считают, что это забыли авторы TClientSocket, другие - что эта строчка - обязанность программеров, использующих этот ClienSocket. Как бы то ни было, эта строчка кода должна быть в этом обработчике.

А теперь насчёт реконнекта:
как я понял, ты вызываешь реконнект сразу же при наступлении события ondisconnect. Но лучше делать так:
в событии onError и onDisconnect в нужном месте пишешь:
ReconnectTimer.Enabled := true;


А вот код :
Procedure ReconnectTimerTimer(...);
begin
ReconnectTimer.Enabled := False;
//Читаешь, настройки коннекта клиента (хотя по идее они все сохранены в самом ClientSocket)
If not Client.Active then Client.Open;
end;

Таким образом, задав св-ву Interval объекта ReconnectTimer, ты получишь реконнект через нужное количество секунд.

Однако, ведь есть ещё ситуация, когда :
-Механизм реконнекта, разрешён в программе
-а пользователь вручну отключил клиента (нажал кнопку DISCONNECT)
По идее в этом случае тоже сработает реконнект (ReconnectTimer.Enabled := true, в событии onDisconnect) - хотя по логике не должен

Простым решением проблемы является создание логич. переменной:
VAR AllowAutoReconnect : Boolean = False;

Итак, при нажатии на кнопку DISCONNECT, в коде ДО Client.Close, пишешь AllowAutoReconnect := False;

а в событии Client.onDisconnect меняешь строчку ReconnectTimer.Enabled := True на
ReconnectTimer.Enabled := AllowAutoReconnect;

Теперь пожелания пользователя будут учтены :)


Dimich1978   (2002-08-28 13:46:00) [3]

Я уже заключал в try except. Но видно это где то глубже. Спасибо за совет. Буду разбираться дальше.


AlexAn   (2002-08-28 09:29:00) [4]

Надо взять в try его:

procedure Timer1Timer(Sender...
begin
try
if not ClientSocket1.Active then
ClientSocket1.Active := true;
except
end;
end;



Dimich1978   (2002-08-27 13:18:00) [5]

Пишу , но выдает ошибку типа Asynchronous socket error 10049. После того как я сервер отрубаю и потом заново включаю.


AlexAn   (2002-08-27 11:28:00) [6]

отрывок кода очень простой:

procedure Timer1Timer(Sender...
begin
if not ClientSocket1.Active then
ClientSocket1.Active := true;
end;


можно все еще это взять в try except, т.к. вероятно с первого раза не сработает, если сервер доступен, то должно соединиться.


Dimich1978   (2002-08-27 09:02:00) [7]

А это код на дисконнект
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
RegIni:tregistry;
begin
cooltrayicon1.IconIndex:=1;
cooltrayicon1.Hint:="Cвязь разована";
{RegIni:=TRegIniFile.Create;
RegIni.RootKey:=HKEY_CURRENT_USER;
RegIni.OpenKey("SOFTWARE",true);
RegIni.OpenKey("AdvSoft",true);
RegIni.OpenKey("CONFIG",true);
IP:=regini.readString("IP");
if regini.ValueExists("Password") then else begin
regIni.WriteString("Password","346444");
end;
if IP<>"" then begin
label2.caption:=GetComputerName;
clientsocket1.Host:=IP;
clientsocket1.Port:=1025;
clientsocket1.open;
label1.caption:="Соединение установлено";
end;
end;


Dimich1978   (2002-08-27 08:59:00) [8]

Да я пытаюсь по таймеру подконнектится, но я не пойму как проверить доступность сервера, т.е. я что делаю. Я если связи нет, пытаюсь просто выполнить заново коннект т.к. уже знаю что связь разорвана, но у меня заново связь не восстанавливается( и именно когда отрубается сервер). Если можно отрывок кода как проверить доступность сервера?. Заранее благодарен.


AlexAn   (2002-08-26 13:18:00) [9]

в этом случае произойдет тот-же дисконнект (это сделанно на уровне систеиы), все, что надо это переодически (например по таймеру) проверять доступность сервера и пытаться с ним соединиться.


Наверх

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