【问题标题】:Read all data on Indy Server buffer读取 Indy Server 缓冲区上的所有数据
【发布时间】:2014-05-20 21:04:53
【问题描述】:

我在 TCP/IP 中有一个客户端,它发送带有 writeln 的字符串列表(同时)。 TCPserver如何知道它已经读取了所有数据? 在Onexecute事件中,我使用过:

If (not AThread.Terminated)and(athread.Connection.Connected) then
  Memo1.lines.add(AThread.Connection.readln);

但问题是最后几行没有被读取。

【问题讨论】:

    标签: delphi indy freepascal


    【解决方案1】:

    您应该使用自己的WriteLn() 发送每个字符串,然后您可以:

    1. 在发送实际字符串之前发送字符串数。然后服务器可以先读取号码,然后拨打ReadLn(),无论号码显示多少次。

    2. 在字符串之后发送唯一的终止行。然后服务器可以继续调用ReadLn(),直到读取终止符。如果您需要发送一个可能与终止符不明确的字符串,请在发送前转义该字符串,然后让服务器在读取后对其进行转义。

    Indy 有处理这两种情况的读/写方法,例如WriteStrings()ReadStrings()WriteRFCStrings()Capture() 等。

    在不相关的注释中,您不应该检查 AThread.TerminatedAThread.Connection.Connected 属性。如果您尝试读取或写入断开连接的套接字,让 Indy 引发异常,并让服务器处理该异常。此外,TIdTCPServer 是多线程的,在OnExecute 事件(或OnConnectOnDisconnectOnException)中访问 UI 控件不是线程安全的。您必须与主 UI 线程同步才能安全地访问它们。

    【讨论】:

    • 或者你可以根据时间安排。如果 xxx ms 没有新数据,则终止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多