2014-05-20 37 views
0

我在TCP/IP中有一个客户端,它可以发送包含writeln(全部同时)的字符串列表。 TCPserver如何知道它已经读取了所有的数据? 在Onexecute情况下,我用:读取Indy服务器缓冲区上的所有数据

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

但问题是,有些最后行不读。

回答

1

你应该把每串有自己的WriteLn(),那么您可以:

  1. 发送实际的字符串前发送串的数量。然后,服务器可以先读取该号码,然后拨打ReadLn(),然而该号码表示多次。

  2. 在字符串后面发送一个唯一的终止行。服务器然后可以保持呼叫ReadLn(),直到读取终止符。如果你需要发送一个可能与终结者密切相关的字符串,那么在发送它之前先将字符串转义出来,然后让服务器在阅读它之后再隐藏它。

印已经阅读用于处理这两种情况/写作方法,如WriteStrings()ReadStrings()WriteRFCStrings()Capture()

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

+0

或者你可以根据时机来决定。如果没有新的数据为xxx毫秒,则终止。 –