我在TCP / IP中有一个客户端,它发送一个包含writeln
的字符串列表(所有这些都在同一时间)。
TCP服务器如何知道它已读取所有数据?
在Onexecute
事件中,我使用过:
If (not AThread.Terminated)and(athread.Connection.Connected) then
Memo1.lines.add(AThread.Connection.readln);
但问题是,有些最后一行不会被读取。
答案 0 :(得分:1)
您应该使用自己的WriteLn()
发送每个字符串,然后您可以:
在发送实际字符串之前发送字符串数。然后,服务器可以先读取该号码,然后拨打ReadLn()
,无论该号码是多少次。
在字符串后面发送一个唯一的终止行。然后,服务器可以继续调用ReadLn()
,直到读取终结符。如果你需要发送一个可能与终结符有关的字符串,请在发送之前转义该字符串,然后让服务器在读取之后将其取消。
Indy拥有处理这两种方案的读/写方法,例如WriteStrings()
,ReadStrings()
,WriteRFCStrings()
,Capture()
等。
在不相关的说明中,您不应该检查AThread.Terminated
和AThread.Connection.Connected
属性。如果您尝试读取或写入已断开连接的套接字,请让Indy引发异常,并让服务器处理异常。此外,TIdTCPServer
是多线程的,访问OnExecute
事件(或OnConnect
,OnDisconnect
或OnException
)中的UI控件不是线程安全的。您必须与主UI线程同步才能安全地访问它们。