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