Форум: "Сети";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];
ВнизСобытие OnDisconnect Найти похожие ветки
← →
Dimich1978 (2002-08-26 11:43) [0]Я как понял это событие происходит один раз и по вине самого приложения или по вине сервера(дисконнект вообщем). Но вот вопрос если у меня рухнул сервер (подвис сам, или винда) что привело к перезагрузке компа. ТО клиент должен подконнектится сам после того как сервер заново запустится. Как это можно реализовать.
← →
AlexAn (2002-08-26 13:18) [1]в этом случае произойдет тот-же дисконнект (это сделанно на уровне систеиы), все, что надо это переодически (например по таймеру) проверять доступность сервера и пытаться с ним соединиться.
← →
Dimich1978 (2002-08-27 08:59) [2]Да я пытаюсь по таймеру подконнектится, но я не пойму как проверить доступность сервера, т.е. я что делаю. Я если связи нет, пытаюсь просто выполнить заново коннект т.к. уже знаю что связь разорвана, но у меня заново связь не восстанавливается( и именно когда отрубается сервер). Если можно отрывок кода как проверить доступность сервера?. Заранее благодарен.
← →
Dimich1978 (2002-08-27 09:02) [3]А это код на дисконнект
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;
← →
AlexAn (2002-08-27 11:28) [4]отрывок кода очень простой:
procedure Timer1Timer(Sender...
begin
if not ClientSocket1.Active then
ClientSocket1.Active := true;
end;
можно все еще это взять в try except, т.к. вероятно с первого раза не сработает, если сервер доступен, то должно соединиться.
← →
Dimich1978 (2002-08-27 13:18) [5]Пишу , но выдает ошибку типа Asynchronous socket error 10049. После того как я сервер отрубаю и потом заново включаю.
← →
AlexAn (2002-08-28 09:29) [6]Надо взять в try его:
procedure Timer1Timer(Sender...
begin
try
if not ClientSocket1.Active then
ClientSocket1.Active := true;
except
end;
end;
← →
Dimich1978 (2002-08-28 13:46) [7]Я уже заключал в try except. Но видно это где то глубже. Спасибо за совет. Буду разбираться дальше.
← →
VID (2002-08-29 00:21) [8]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;
Теперь пожелания пользователя будут учтены :)
← →
VID (2002-08-29 00:26) [9]Кстати, забыл сказать, что в Client.onConnect где нибудь среди первых строчек кода надо написать AllowAutoReconnect := true. Таким образом состояние механизма реконнекта клиента будет приведено к начальному - т.е. клиент готов включить реконнект, в случае аварийного отключения
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c