2014-05-20 40 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毫秒,則終止。 –