我在TCP/IP中有一个客户端,它可以发送包含writeln
(全部同时)的字符串列表。 TCPserver如何知道它已经读取了所有的数据? 在Onexecute
情况下,我用:读取Indy服务器缓冲区上的所有数据
If (not AThread.Terminated)and(athread.Connection.Connected) then
Memo1.lines.add(AThread.Connection.readln);
但问题是,有些最后行不读。
我在TCP/IP中有一个客户端,它可以发送包含writeln
(全部同时)的字符串列表。 TCPserver如何知道它已经读取了所有的数据? 在Onexecute
情况下,我用:读取Indy服务器缓冲区上的所有数据
If (not AThread.Terminated)and(athread.Connection.Connected) then
Memo1.lines.add(AThread.Connection.readln);
但问题是,有些最后行不读。
你应该把每串有自己的WriteLn()
,那么您可以:
发送实际的字符串前发送串的数量。然后,服务器可以先读取该号码,然后拨打ReadLn()
,然而该号码表示多次。
在字符串后面发送一个唯一的终止行。服务器然后可以保持呼叫ReadLn()
,直到读取终止符。如果你需要发送一个可能与终结者密切相关的字符串,那么在发送它之前先将字符串转义出来,然后让服务器在阅读它之后再隐藏它。
印已经阅读用于处理这两种情况/写作方法,如WriteStrings()
,ReadStrings()
,WriteRFCStrings()
,Capture()
等
在一个不相关的音符,你不应该检查AThread.Terminated
和AThread.Connection.Connected
性能。如果尝试读取或写入断开连接的套接字,让Indy引发异常,并让服务器处理异常。此外,TIdTCPServer
是多线程的,访问OnExecute
事件(或OnConnect
,OnDisconnect
或OnException
)中的UI控件不是线程安全的。您必须与主UI线程同步才能安全地访问它们。
或者你可以根据时机来决定。如果没有新的数据为xxx毫秒,则终止。 –