Delphi中的TCPclient.connected问题 - Indy

时间:2011-05-02 00:07:06

标签: delphi delphi-2010 tcpclient indy indy10

我在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;

通过以上两种编码,程序可以很好地重新连接和重置连接。但有些人认为程序根本无法重新连接或重置连接。

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

亲切的问候,

2 个答案:

答案 0 :(得分:4)

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;

答案 1 :(得分:0)

在连接之前

确保idftp的被动布尔值为false 当您需要文件传输时,使用二进制文件选项将其更改为true