Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2014, 17:45   #1
Timon.cheg
Пользователь
 
Регистрация: 10.04.2014
Сообщений: 24
Вопрос Переподключение к серверу

Ребята, простите грешного если задам супер нубский вопрос, но как грамотно организовать проверку на соединение и последующее переподключение к серверу?

Есть таймер на 30 сек , пингую , обновляю на форме пинг:
ping:=IntToStr(IdIcmpClient1.ReplyS tatus.MsRoundTripTime);
помимо этого использую
IdIcmpClient1 для соединения и IdThreadComponent1 для передачи потоков

вот кусок кода таймера, поправьте меня пожалуйста =)

Код:
procedure TForm1.Timer7Timer(Sender: TObject);    //автореконнект
var
Srvconn1:boolean;
begin
Srvconn1:=true;
  IdIcmpClient1.Ping();
  ping:=IntToStr(IdIcmpClient1.ReplyStatus.MsRoundTripTime);
  Label1.Caption:='На связи : '+ping+' ms';

  if ping>4500 then
   begin

        Label1.Caption:='Не доступен';
        Memo1.Lines.Add('client: Связь с сервером потеряна ждите восстановление подключения.');   //Выводим сообщение
        form1.Refresh;

         if IdTCPClient1.Connected=true then  begin  IdTCPClient1.Socket.Close; IdTCPClient1.Disconnect;  end;
           try
            IdTCPClient1.Connect;
          except
           Memo1.Lines.Add('client: Не удалось соедениться с сервером.');
          end;
     Srvconn1:=false;
   end;

  if ping<4500 and Srvconn1=false  then
   begin

          Memo1.Lines.Add('Dota2 lobby client: Соединение с сервером восстановлено.');
          IdTCPClient1.Connect;
          Srvconn1:=true;

   end;
end;
Timon.cheg вне форума Ответить с цитированием
Старый 30.06.2014, 18:24   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Допустим так:
Код:
procedure TForm1.Timer7Timer(Sender: TObject);  
begin
          try
            IdTCPClient1.Connect;
            TTimer(Sender).Enable:=false;
          except
           Memo1.Lines.Add('client: Не удалось соедениться с сервером.');
          end;
end;
Только зачем это нужно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.06.2014, 18:28   #3
Timon.cheg
Пользователь
 
Регистрация: 10.04.2014
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Допустим так:
Код:
procedure TForm1.Timer7Timer(Sender: TObject);  
begin
          try
            IdTCPClient1.Connect;
            TTimer(Sender).Enable:=false;
          except
           Memo1.Lines.Add('client: Не удалось соедениться с сервером.');
          end;
end;
Только зачем это нужно?
Извини , я не правильно сформулировал вопрос видимо...
нужно при нормальном соединении - выводить только пинг , а при разрыве - пытаться восстановить по таймеру, при восстановлении продолжить штатную работу ...
Timon.cheg вне форума Ответить с цитированием
Старый 30.06.2014, 18:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда не очень понимаю что там поправлять?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.06.2014, 19:15   #5
Timon.cheg
Пользователь
 
Регистрация: 10.04.2014
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Тогда не очень понимаю что там поправлять?
по факту он почему-то начинает думать что надо переподрубиться (и это при нормальном коннекте) , вот и думаю где я накосячил , а еще думал что кто-нибудь умный ткнет в меня ссылкой , где показан подобный метод но проще и грамотней )
Timon.cheg вне форума Ответить с цитированием
Старый 30.06.2014, 19:26   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мне кажется тебе нужно в корне менять стратегию.
Создай TThread, в которую пропиши подключение типа:
Код:
begin
while true 
          try
            IdTCPClient1.Connect;
            break;
            sleep(100);
          except
           Memo1.Lines.Add('client: Не удалось соедениться с сервером.');
          end;
end;
И запускай ее в IdTCPClient1.OnDisconnect;
Мол - переподключайся до востребования если отключился.
По-моему так проще.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переподключение интернета при разрыве BarakudaX777 Работа с сетью в Delphi 9 17.05.2013 09:53
pppoe переподключение Painkiller_13 Общие вопросы Delphi 6 30.12.2011 16:30
Переподключение ADSL соединения Qami Общие вопросы Delphi 2 09.05.2010 20:21
Автоматическое переподключение интернета sibirnik Свободное общение 0 20.01.2010 13:01
Переподключение к телнет-серверу Alex_C Работа с сетью в Delphi 0 11.03.2009 16:05