处理Indy TCP Server在Delphi Xe3中执行的最佳实践

时间:2013-12-05 14:31:34

标签: delphi tcp indy

当从indy TCPServers执行方法接收数据时,我通常通过执行以下操作来读取数据来处理它:

AContext.Connection.IOHandler.ReadLn;

然后在execute方法中处理数据。大多数数据都是小的JSon字符串。

将来我需要处理更大的数据块,并且想知道最好的实践是什么?

将传入数据添加到TidContext类并使用某个工作线程处理它是一个好主意吗?任何想法或代码样本将不胜感激。我使用Indy 10和Delphi XE3

2 个答案:

答案 0 :(得分:1)

OnExecute事件已在工作线程中触发,因此接收数据所需的时间无关紧要。只要数据在其末尾只有1 (CR)LFReadLn()就不会关心字符串的实际长度(取决于IOHandler的MaxLineActionMaxLineLength属性,如果需要你可以调整)。但是,如果数据中的数据超过1 (CR)LF,则您必须:

  1. 在传输实际字符串之前传输字符串长度,然后在接收代码中使用ReadLongInt()ReadString()代替ReadLn()

  2. 使用与(CR)LF不同的分隔符终止字符串,然后将该分隔符传递给ReadLn(),以便知道何时停止阅读。

答案 1 :(得分:0)

如果服务器必须以保证的速率接收传入请求,而不会通过慢速请求处理阻止使用者,则将大数据块保存到数据存储(文件,数据库)以供以后处理可能是一种解决方案。

这将使HTTP服务器线程尽快用于下一个请求。

它还允许多个工作服务器进行数据处理,并进行负载平衡。