gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:58:37 27 4
gpt4 key购买 nike

我是 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/

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