【问题标题】:How To Deal With MaxLineLengthExceeded With Indy TIdTCPClientIndy TIdTCPClient 如何处理 MaxLineLengthExceeded
【发布时间】:2015-05-29 21:40:09
【问题描述】:

我是 indy 的新手,使用 CBuilder XE4 附带的任何版本。这是非常简单的代码,可以正常工作,直到我正在阅读的内容超过 16K 限制....

String Ttcp_mgr::send(String data)
{
  tcpClient->Socket->WriteLn(data); 
  return tcpClient->Socket->ReadLn();
}

服务器没有使用 indy,没有长度头,双向都是 json 被 \r\n 终止。阻止读取很好,我的应用程序在得到响应之前无事可做,无论如何它都会很快到来。但在少数情况下,返回的数据量可能是几个字节或 100K。一般长度小于 500 字节。

我看过 IOHandler 但我不知道如何将它应用到我正在做的事情中,甚至不确定它是否是我需要的。正如您可能知道的那样,我没有在可能没有区别的表单上使用该组件。

【问题讨论】:

    标签: indy


    【解决方案1】:

    TIdIOHandler::ReadLn() 有一个可选的AMaxLineLength 输入参数。如果不为其指定值,则使用TIdIOHandler::MaxLineLength 属性,默认设置为16K。 TIdIOHandler::MaxLineAction 属性指定如果 ReadLn() 实际达到最大行长度会发生什么。

    如果MaxLineActionmaException(默认值),则会引发EIdReadLnMaxLineLengthExceeded 异常。

    如果MaxLineActionmaSplit,则TIdIOHandler::ReadLnSplit 属性设置为true,ReadLn() 会返回它所能返回的值。您必须再次调用ReadLn() 才能读取当前行的更多数据。如果对非 ASCII 字符使用多字节编码,例如 UTF-8(这是 JSON 的默认编码),则最终可能会错误地截断数据,因此我不推荐这种方法。

    在您的情况下,您应该:

    1. TIdIOHandler::MaxLineLength 属性设置为MaxInt

      // TIdTCPClient::OnConnected event handler...
      void __fastcall Ttcp_mgr::tcpCllientConnected(TObject *Sender)
      {
          tcpClient->IOHandler->MaxLineLength = MaxInt;
      }
      
    2. MaxInt 作为参数传递给TIdIOHandler::ReadLn()

      String Ttcp_mgr::send(String data)
      {
          tcpClient->Socket->WriteLn(data); 
          return tcpClient->Socket->ReadLn(EOL, IdTimeoutDefault, MaxInt);
      }
      

    【讨论】:

      【解决方案2】:

      致所有 Delphi 用户:设置 IOHandler.MaxLineLength 为“MaxInt”必须在启动连接后完成,否则会出现内存错误。

      IdPOP31.Connect;
      IdPOP31.IOHandler.MaxLineLength := MaxInt;
      

      其他一切如上,解决了 Delphi 解析过长电子邮件的问题。

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 1970-01-01
        • 2012-07-29
        • 2014-06-12
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        • 2017-05-09
        • 2011-06-27
        相关资源
        最近更新 更多