我知道我希望从客户端获得多少字节(在此代码中为100)。如果客户没有给我100,我根本不需要这个包,因为它已经损坏了。
我遇到客户端提供少于100个字节并断开连接的情况。在这种情况下,我捕捉异常并且一切都会好的,除了在此异常之后我的ServerTCPExecute
被连续多次调用。没有任何其他客户连接。为什么会这样?如果我做TIdYarnOfThread(AContext.Yarn).Thread.Terminate;
一切都很顺利。但我不确定这是好的解决方案。
procedure Form1.ServerTCPExecute(AContext: TIdContext);
begin
try
AContext.Connection.IOHandler.ReadBytes(b, 100, False);
except
//TIdYarnOfThread(AContext.Yarn).Thread.Terminate;
end;
end;
答案 0 :(得分:3)
解决方案:请勿使用try ... except
来捕捉并忽略OnExecute
中的所有异常。
这将吞下在客户端断开连接时发生的Indy异常,如果OnExecute
中仍有数据,服务器将执行IOHandler.InputBuffer
的下一次迭代,ReadBytes
会引发另一个异常异常,因为对等体断开连接。
如果引发任何异常并离开该方法,Indy TCP服务器将关闭并清理连接。
Indy在OnExecute
中使用异常进行错误处理和通知,因此不要使用"空"来禁止它们。异常处理程序如果您需要捕获异常,请重新引发您捕获的任何EIdException
派生的异常,并让服务器处理它们。
p.s。:发布的代码似乎使用非局部变量b
。因为TIdTCPServer
是一个多线程组件,所以必须始终以线程安全的方式访问非局部变量,例如使用临界区,或将变量放在TIdContext
对象内。 / p>