我在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;
但是有一点,我得到了例外,它根本无法连接。我不确定我做错了什么。
我应该这样做吗?
如果是这样的话,有人能为我提供一个如何正确操作的方法吗?
此外,还有另一项功能是在我的编码中重新连接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;
通过以上两种编码,程序可以很好地重新连接和重置连接。但有些人认为程序根本无法重新连接或重置连接。
亲切的问候,
答案 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