Delphi-Indy中的TCPclient.connected问题
我在Delphi中使用Indy的IdTCPclient.connected函数时遇到问题。我正在使用Indy10和Delphi2010环境。我的问题是每次我检查与IdTCPclient.connected的TCP连接时,都会引发异常,出现以下错误EidSocketError,EidReadTimeOut。有没有办法断开和重新连接?(如重置连接) 注意:我设置了TCPClient.ReTimeout:=30000 重置连接的实施编码如下所示Delphi-Indy中的TCPclient.connected问题,delphi,delphi-2010,tcpclient,indy,indy10,Delphi,Delphi 2010,Tcpclient,Indy,Indy10,我在Delphi中使用Indy的IdTCPclient.connected函数时遇到问题。我正在使用Indy10和Delphi2010环境。我的问题是每次我检查与IdTCPclient.connected的TCP连接时,都会引发异常,出现以下错误EidSocketError,EidReadTimeOut。有没有办法断开和重新连接?(如重置连接) 注意:我设置了TCPClient.ReTimeout:=30000 重置连接的实施编码如下所示 if IdTCPclient.connected the
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
- 然后再连接它
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()
不应该引发任何异常。如果是,那么它很可能是一个bug。请提供一个堆栈跟踪来显示这一点
最好的选择是尽可能避免使用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;
试试看
IdTCPClient.DoSomething。。。
除了
在E:EID上,异常是否开始
重新连接;
结束;
结束;
程序重新连接;
变量
k:整数;
开始
IdTCPClient.Disconnect;
如果IdTCPClient.IOHandler为nil,则
IdTCPClient.IOHandler.InputBuffer.Clear;
对于k:=0到4 do
开始
睡眠(1000);
尝试
IdTCPClient.Connect;
出口
除了
关于E:Exception-do
开始
MessageDlg('连接错误:'+E.Message,mtError,[mbOk],0);
如果k=4,则
提高;
结束;
结束;
结束;
结束;
连接之前,请确保idftp的被动布尔值为false
当您需要文件传输时,请不要使用“二进制文件”选项将其更改为“真”我是否可以建议将您的问题分成几个较小的问题,这些问题可以单独回答。可能与此类似?与OP类似,我看到Indy10 Connected()引发了一个异常。堆栈跟踪此处没有行号-抱歉@罗迪:那没有道理
ReadDataFromSource()
不会被调用,除非套接字首先处于可读状态(TIdSocketHandle.readable()
返回True),这仅在套接字有实际数据要读取,或者对等方已正常断开连接时才会发生。Receive()。实际引发了什么异常,报告了什么套接字错误代码?EIdSocketError
,10054由对等方重置连接。这确实很奇怪,但似乎可以修复。Indy是MJF的最新SVN。我有一个“工作”连接,然后拔下插头。客户端尝试发送数据并获取EIdSocketError(这很好),但在异常处理程序中,我调用Connected(),它也会引发相同的异常。读取由另一个线程处理。啊,这解释了为什么Receive()
可能会失败。结果是TIdStackBSDBase.Receive()
正在调用CheckForSocketError()
,但是TIdIOHandler
希望处理套接字错误(通过让Connected()
放弃它)。我必须研究一下,我认为TIdStack
类调用的CheckForSocketError()
通常太多了。无论如何,您都不应该调用Connected()
。您已经知道套接字没有连接,因为您收到了一个EIdSocketError/10054
异常,因此调用connected()
将是多余的。@Remy有一次(6年前)您说过,来自TIdTCPClient的connected()不应该引发任何异常,但它确实存在。这是一个尚未解决的老错误吗?