Indy WriteLn 和 ReadLn 字符串的最大长度是多少?
Posted
技术标签:
【中文标题】Indy WriteLn 和 ReadLn 字符串的最大长度是多少?【英文标题】:What is Indy WriteLn and ReadLn string max length? 【发布时间】:2022-01-19 13:24:14 【问题描述】:使用 Indy 方法 WriteLn
和 ReadLn
发送和读取的字符串长度是否有限制?
【问题讨论】:
【参考方案1】:TIdIOHandler.WriteLn()
仅受可用内存限制。但是,请注意,它将EOL
(#13#10
) 附加到输入字符串的末尾,生成一个作为原始副本的新字符串,然后将该副本转换为TIdBytes
以进行发送。因此,将使用更多的内存,而不仅仅是您传入的内存。我相信这在未来可以得到更好的优化。
TIdIOHandler.ReadLn()
有一个可选的AMaxLineLength
参数,默认设置为-1
。如果设置为< 0
,则将使用TIdIOHandler.MaxLineLength
属性,默认设置为16384
字节。如果需要,您可以将(A)MaxLineLength
设置得更高,或者您甚至可以将其设置为0
以完全禁用限制。如果(A)MaxLineLength
设置为> 0
并且传入的数据超过该限制,则后续行为取决于TIdIOHandler.MaxLineAction
属性:
maException
(默认值):引发EIdReadLnMaxLineLengthExceeded
,接收到的字节将保留在TIdIOHandler.InputBuffer
中以供后续读取。
maSplit
:精确的(A)MaxLineLength
字节数将从TIdIOHandler.InputBuffer
中提取并作为String
返回,TIdIOHander.ReadLnSplit
属性将设置为True
。剩余字节将保留在TIdIOHandler.InputBuffer
中以供后续读取。
【讨论】:
感谢您准确详细的回复。我还有一个问题,不知道要不要再开个帖子:TCPClient->IOHandler->MaxLineLength = 0;
和TCPClient->Socket->MaxLineLength = 0;
有什么区别?我的意思是:使用Socket
和IOHandler
之间的区别。看来我可以在同一个地方以同样的方式使用两者。
@user3680100 "[IOHandler] 和 [Socket] 有什么区别?" - 当IOHandler
被分配一个TIdIOHandlerSocket
派生对象时,@987654352 @ 设置为同一个对象,否则设置为nil
。所以Socket
只是一个快捷方式,可以避免在需要访问特定于套接字的功能时必须对IOHandler
进行类型转换。
当我设置TCPClient->IOHandler->MaxLineLength = 0;
或TCPClient->Socket->MaxLineLength = 0;
我得到错误Project CMRemoteViewer.exe raised exception class $C0000005 with message 'access violation at 0x0041b484: write of address 0x000000b8'.
对不起.....我搞砸了 cmets....不知道要删除什么而不造成其他损害...我道歉
我发现错误:设置属性MaxLineLength
时TCPClient未连接以上是关于Indy WriteLn 和 ReadLn 字符串的最大长度是多少?的主要内容,如果未能解决你的问题,请参考以下文章
Delphi XE8报错:There is no overloaded version of 'ReadLn' that can be called with these argume