当从indy TCPServers执行方法接收数据时,我通常通过执行以下操作来读取数据来处理它:
AContext.Connection.IOHandler.ReadLn;
然后在execute方法中处理数据。大多数数据都是小的JSon字符串。
将来我需要处理更大的数据块,并且想知道最好的实践是什么?
将传入数据添加到TidContext类并使用某个工作线程处理它是一个好主意吗?任何想法或代码样本将不胜感激。我使用Indy 10和Delphi XE3
答案 0 :(得分:1)
OnExecute
事件已在工作线程中触发,因此接收数据所需的时间无关紧要。只要数据在其末尾只有1 (CR)LF
,ReadLn()
就不会关心字符串的实际长度(取决于IOHandler的MaxLineAction
和MaxLineLength
属性,如果需要你可以调整)。但是,如果数据中的数据超过1 (CR)LF
,则您必须:
在传输实际字符串之前传输字符串长度,然后在接收代码中使用ReadLongInt()
和ReadString()
代替ReadLn()
。
使用与(CR)LF
不同的分隔符终止字符串,然后将该分隔符传递给ReadLn()
,以便知道何时停止阅读。
答案 1 :(得分:0)
如果服务器必须以保证的速率接收传入请求,而不会通过慢速请求处理阻止使用者,则将大数据块保存到数据存储(文件,数据库)以供以后处理可能是一种解决方案。
这将使HTTP服务器线程尽快用于下一个请求。
它还允许多个工作服务器进行数据处理,并进行负载平衡。