我在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毫秒,則終止。 –