Sockets Indy-READLNSPILT在关闭时导致NotConnected异常

Sockets Indy-READLNSPILT在关闭时导致NotConnected异常,sockets,exception,indy,Sockets,Exception,Indy,我使用TIdTCPServer和以下代码读取客户端输入: repeat cl3:=cl3+AContext.Connection.IOHandler.ReadLnSplit(WasSplit,#0,-1,-1,TEncoding.UTF8); until not WasSplit; 但是,如果客户端连接到服务器,并且我关闭了服务器,则会引发一个异常类(EIdNotConnected),消息为“未连接”。 如果我使用ReadLn而不是ReadLnSplit,则不会引发异常 导致此

我使用TIdTCPServer和以下代码读取客户端输入:

repeat
    cl3:=cl3+AContext.Connection.IOHandler.ReadLnSplit(WasSplit,#0,-1,-1,TEncoding.UTF8);
    until not WasSplit;
但是,如果客户端连接到服务器,并且我关闭了服务器,则会引发一个异常类(EIdNotConnected),消息为“未连接”。
如果我使用ReadLn而不是ReadLnSplit,则不会引发异常

导致此异常的原因是什么?我如何防止它

我想解决办法很简单,但我对sockets和Indy还不熟悉,我想不出来


提前感谢。

实际问题是什么?关闭服务器时,假定使活动读/写操作引发异常。这是印第的正常行为
ReadLn()
引发异常的可能性与
ReadLnSplit()
引发异常的可能性相同。Indy的内部通知依赖例外情况。只需让服务器为您处理异常,这样它就可以终止并清理管理
TIdContext
及其连接的线程。例外情况是在该线程的上下文中,其余代码(或用户)将看不到它

ReadLnSplit()
ReadLn()。使用
ReadLnSplit()。如果您不喜欢
ReadLnSplit()
的行为方式,请不要使用它。您只需增加IOHandler的
MaxLineLength
属性的值,然后调用
ReadLn()

AContext.Connection.IOHandler.MaxLineLength := MaxInt;
cl3 := AContext.Connection.IOHandler.ReadLn(#0, IndyUTF8Encoding);
或者可以调用重载版本的
ReadLn()
,该版本具有可选的
AMaxLineLength
参数:

cl3 := AContext.Connection.IOHandler.ReadLn(#0, IdTimeoutDefault, MaxInt, IndyUTF8Encoding);