Tcpclient.condnected Проблема в Delphi - Indy
-
27-10-2019 - |
Вопрос
У меня проблемы с Idtcpclient.connected Функция из Indy в Delphi. Я использую среду Indy10 и Delphi2010. Моя проблема - каждый раз, когда я проверяю соединение TCP с Idtcpclient.connected, это повышает исключение с этими ошибками Eidsocketerror, Eidreadtimeout. Анкет Есть ли способ отключить и подключить соединение? (как сбросить соединение).
ПРИМЕЧАНИЕ. Я установил tcpclient.retimeout: = 30000;
Реализованное кодирование для сброса подключение следует.
if IdTCPclient.connected then
begin
IdTCPclient.IOHandler.InputBuffer.Clear;
IdTCPclient.Disconnect;
end;
sleep(1000);
try
IdTCPclient.connect;
except
on E: Exception do
MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
end;
Но какой -то момент, я получаю исключение, и он вообще не мог подключиться. Я не уверен, что я делаю не так.
Мне это сделать?
- Отключите сначала
- Чистый входной буфер
- Уничтожить tcpclient
- Воссоздать новый TCPClient
- А затем подключите его снова
Если это так, может ли кто -нибудь дать мне способ сделать это правильно?
Кроме того, есть еще одна функция для повторного соединения TCP в моем кодировании. Это также дает мне исключение. Я проверяю подключение, прежде чем отправить сообщение в TCP. Если нет связи, я воссоединяюсь в течение пять раз.
result := IdTCPclient.connected
if not result then
begin
for k:=0 to 4 do
beign
sleep(1000);
try
TCPclient.connect;
except
on E: Exception do
MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
end
result := TCPclient.connected;
if result then break;
end;
С двумя вышеупомянутыми кодированием программа обрабатывает подключение и сброс соединения довольно хорошо. Но в какой-то момент программа не может повторно подключить или сбросить соединение вообще.
- Что мне делать, когда я получу исключение? Должен ли я воссоединиться от исключения?
- Как создавать кодирование, чтобы регулярно проверять соединение?
- Как создать кодирование, чтобы вернуть соединение, когда оно проиграет?
С уважением,
Решение
Connected()
не должно вообще подниматься вообще. Если это так, то это, вероятно, ошибка. Пожалуйста, предоставьте трассировку стека, показывающая это.
Лучший вариант - просто избегать использования Connected()
при любой возможности. Когда вам нужно выполнить операцию ввода/вывода, просто сделайте это и позвольте Indy поднять исключение, если произойдет сбой. Затем вы можете справиться с этим в этот момент, например:
try
IdTCPClient.DoSomething...
except
on E: EIdException do begin
Reconnect;
end;
end;
procedure Reconnect;
var
k: Integer;
begin
IdTCPClient.Disconnect;
if IdTCPClient.IOHandler <> nil then
IdTCPClient.IOHandler.InputBuffer.Clear;
for k := 0 to 4 do
begin
Sleep(1000);
try
IdTCPClient.Connect;
Exit;
except
on E: Exception do
begin
MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
if k = 4 then
raise;
end;
end;
end;
end;
Другие советы
Перед подключением убедитесь, что пассивный логический IDFTP является ложным, когда вам нужно перевести файл