Delphi中的TCPclient.connected问题-Indy

sMa*_*Mah 2 delphi indy tcpclient delphi-2010 indy10

我在Delphi中使用Indy的IdTCPclient.connected函数遇到问题。我正在使用Indy10和Delphi2010环境。我的问题是每次我检查与IdTCPclient.connected的TCP连接时,它都会引发这些错误EidSocketErrorEidReadTimeOut的异常。有什么办法可以断开并重新连接?(如重置连接)。

注意:我设置了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;
Run Code Online (Sandbox Code Playgroud)

但有一点,我遇到了异常,它根本无法连接。我不确定自己在做什么错。

我应该这样做吗?

  • 首先断开连接
  • 清除输入缓冲区
  • 销毁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;
Run Code Online (Sandbox Code Playgroud)

通过以上两种编码,程序可以很好地处理重新连接和重置连接。但是有些时候程序根本无法重新连接或重置连接。

  • 遇到异常我该怎么办?我应该从异常中重新连接吗?
  • 我们如何建立编码以定期检查连接?
  • 我们如何构建编码以在连接丢失时找回连接?

亲切的问候,

Rem*_*eau 5

Connected()根本不应该提出任何例外。如果是这样,则可能是一个错误。请提供一个堆栈跟踪显示。

最好的选择是尽可能地避免使用Connected()。当您需要执行I / O操作时,只需执行此操作,并在发生故障时让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;
Run Code Online (Sandbox Code Playgroud)