- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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()
实际上达到最大行长度时会发生什么。
如果 MaxLineAction
为 maException
(默认值),则会引发 EIdReadLnMaxLineLengthExceeded
异常。
如果 MaxLineAction
为 maSplit
,则 TIdIOHandler::ReadLnSplit
属性设置为 true,并且 ReadLn()
返回它所能返回的。您必须再次调用 ReadLn()
才能读取当前行的更多数据。如果对非 ASCII 字符使用多字节编码(例如 UTF-8(这是 JSON 的默认编码)),这最终可能会错误地切割数据,因此我不推荐这种方法。
就您而言,您应该:
将 TIdIOHandler::MaxLineLength
属性设置为 MaxInt
:
// TIdTCPClient::OnConnected event handler...
void __fastcall Ttcp_mgr::tcpCllientConnected(TObject *Sender)
{
tcpClient->IOHandler->MaxLineLength = MaxInt;
}
将 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/
我是 indy 新手,使用 CBuilder XE4 附带的任何版本。这是非常简单的代码,在我正在阅读的内容超过 16K 限制之前都可以正常工作...... String Ttcp_mgr::send
我是一名优秀的程序员,十分优秀!