【问题标题】:Indy - ReadLnSplit Causes NotConnected Exception when closingIndy - ReadLnSplit 在关闭时导致 NotConnected 异常
【发布时间】:2012-03-21 04:37:53
【问题描述】:

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

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

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

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

我想解决方案很简单,但我是 sockets 和 Indy 的新手,我想不通。

提前致谢。

【问题讨论】:

    标签: sockets exception indy


    【解决方案1】:

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

    ReadLnSplit()ReadLn() 唯一不同的是在调用期间将 IOHandler 的MaxLineAction 属性强制为maSplit,仅此而已。使用ReadLnSplit() 的唯一原因是在不更改MaxLineLength 的情况下处理比IOHandler 的MaxLineLength 属性更长的行。如果您不喜欢 ReadLnSplit() 的行为方式,请不要使用它。您可以只增加 IOHandler 的 MaxLineLength 属性的值并改为调用 ReadLn()

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

    或者您可以调用具有可选AMaxLineLength 参数的ReadLn() 的重载版本:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多