gpt4 book ai didi

sockets - Indy - ReadLnSplit 在关闭时导致 NotConnected 异常

转载 作者:行者123 更新时间:2023-12-03 11:52:20 25 4
gpt4 key购买 nike

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

repeat
cl3:=cl3+AContext.Connection.IOHandler.ReadLnSplit(WasSplit,#0,-1,-1,TEncoding.UTF8);
until not WasSplit;

但是,如果客户端连接到服务器并且我关闭服务器,它会引发一个异常类 (EIdNotConnected),其中包含消息“未连接”。
如果我使用 ReadLn 而不是 ReadLnSplit,则不会引发异常。

是什么导致了这个异常,我该如何防止它?

我想解决方案很简单,但我是套接字和 Indy 的新手,我无法弄清楚。

提前致谢。

最佳答案

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

唯一ReadLnSplit()ReadLn() 不同是强制IOHandler的MaxLineAction属性(property)到maSplit在那次通话中,没有别的。使用的唯一理由 ReadLnSplit()是处理比 IOHandler 的 MaxLineLength 长的行属性而不更改 MaxLineLength .如果你不喜欢这样的方式 ReadLnSplit()行为,然后不要使用它。您可以增加 IOHandler 的 MaxLineLength 的值属性(property)及电话ReadLn()反而:

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

或者你可以调用 ReadLn() 的重载版本有一个可选的 AMaxLineLength范围:
cl3 := AContext.Connection.IOHandler.ReadLn(#0, IdTimeoutDefault, MaxInt, IndyUTF8Encoding);

关于sockets - Indy - ReadLnSplit 在关闭时导致 NotConnected 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9752357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com