我在Delphi中使用Indy的IdTCPclient.connected函数遇到问题。我正在使用Indy10和Delphi2010环境。我的问题是每次我检查与IdTCPclient.connected的TCP连接时,都会引发这些错误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()。当您需要执行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;

关于delphi - Delphi中的TCPclient.connected问题-Indy,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5852359/

10-10 13:55