2

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

但有些时候,我得到了异常,它根本无法连接。我不确定我做错了什么。

我应该这样做吗?

  • 先断开
  • 清除输入缓冲区
  • 销毁 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;

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

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

亲切的问候,

4

2 回答 2

6

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;
于 2011-05-02T08:58:56.397 回答
0

在连接之前,请确保 idftp 的被动布尔值在需要文件传输时为 false 使用二进制文件选项将其更改为 true

于 2016-09-18T16:31:11.560 回答