indy - 如何处理 Indy TIdTCPClient 超出 MaxLineLength 的情况

标签 indy

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

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

服务器没有使用indy,没有长度 header ,双向都是json以\r\n结尾。阻止读取很好,我的应用程序在得到响应之前没有什么可做的,而且无论如何它都会很快到来。但在某些情况下,返回的数据量可能是几个字节或 100K。通常长度将< 500 字节。

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

最佳答案

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);
    }
    

关于indy - 如何处理 Indy TIdTCPClient 超出 MaxLineLength 的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29268863/

相关文章:

Delphi XE2 Indy 10 TIdCmdTCPServer 卡住应用

delphi - 如何读取 Indy IdHTTP get 的响应

multithreading - 使用-DELPHI中的Indy组件(idTCPServer/idTCPClient)的单服务器与多客户端实时监视系统

json - 如何更改 REST DataSnap 中的内容类型响应

delphi - firemonkey idTcp 和记录

delphi - Indy TCPServer OnExecute 模拟 HTTPServer OnCommandGet

delphi - Indy 是否使用最新版本的 OpenSSL 好?

php - IdHTTPServer接收可读参数

delphi - TIdTCPServer 停止时 SSL_accept 中的 Indy/Libssl32 访问冲突

delphi - Indy 为某些消息返回奇怪的内容类型。怎么解决?