读取Indy Server缓冲区上的所有数据

时间:2014-05-20 21:04:54

标签: delphi indy freepascal

我在TCP / IP中有一个客户端,它发送一个包含writeln的字符串列表(所有这些都在同一时间)。 TCP服务器如何知道它已读取所有数据? 在Onexecute事件中,我使用过:

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

但问题是,有些最后一行不会被读取。

1 个答案:

答案 0 :(得分:1)

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

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

  2. 在字符串后面发送一个唯一的终止行。然后,服务器可以继续调用ReadLn(),直到读取终结符。如果你需要发送一个可能与终结符有关的字符串,请在发送之前转义该字符串,然后让服务器在读取之后将其取消。

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

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