2015-07-10 25 views
0

我有一個使用TIdTCPServer的應用程序。我將空終止的消息發送到服務器(Delphi XE2,隨附的Indy包)作爲空終止的字符串。 的OnExecute過程如下:缺少來自indy TCPServer的數據。 Delphi XE2

procedure TSimpleSslServerForm.TCPServerExecute(AContext: TIdContext); 
var 
    RxBufStr: string; 
begin 
    with AContext.Connection.IOHandler do 
    begin 
    if not InputBufferIsEmpty then 
    begin 
     RxBufStr := InputBufferAsString; 
     Display(RXBufStr); 
     lbl_EventsReceived.Caption := IntToStr(StrToInt(lbl_EventsReceived.Caption) + 1); 
    end; 
    end; 
end; 

我的問題是,如果我發送的郵件很多,如果我不把一個200毫秒的消息之間延遲的話,我失去的數據。

不加延遲: 我要麼鬆散數據完全(從107接收13個消息發送)和/ OT的數據是不正確: < 38> 07月10 9時37分39秒cilad71 QJRN:OPE = JOB被改變日期= 10/07/15 time = 07:59:26 sys = CILAD71 user = GCOX job = QZSOSIGN jobn = ipadr = 192.168.5.121 pgm = QZSOSIGN pgmlib = QSYS date = 07/10/15 time = 07:59:26 user = GCOX行動= PROFILE CHANGED JOBNAME = QZSOSIGN jobnumber可以= 189191 jobusername = QUSER JOBD = QZBSJOBD IPADDRESS = 192.168.5.121%

15年7月10日時間= 08:01:25 =用戶動作GCOX = PROFILE CHANGED JOBNAME = QZSOSIGN jobnumber = 189191 jobusername = QUSER jobd = QZBSJOBD ipaddress = 192.168.5.121%

< 38> Jul 10 09:37:39 cilad71 QJRN:ope = JOB WAS CHANGED date = 10/07/15 time = 08:01:35 sys = CILAD71 user = GCOX job = QPADEV000D jobn = ipadr = 192.168 .5.121 PGM = QWTPIIPP pgmlib = QSYS日期= 07/10/15時間= 08:01:35 =用戶動作GCOX = START JOBNAME = QPADEV000D jobnumber可以= 189401 jobusername = GCOX JOBD = QDFTJOBD IPADDRESS = 192.168.5.121%

粗體事件缺少數據。

我也看到了與TIdUDPServer組件相同的行爲。我看到的唯一區別是,對於UDP,正確接收所有數據所需的延遲時間爲100毫秒,而對於TCP服務器,消息之間的延遲小於200毫秒總是會導致數據丟失。 對於發送到Windows事件服務時的UDP,以便事件顯示在相應的Windows日誌中,不需要延遲,並且我可以正確地看到所有事件。

感謝, 傑夫·考克斯

回答

0

你給不讀書從插座空值終止消息的TIdTCPServer代碼。它只是讀取在該特定時刻出現在套接字上的任何原始數據發生的。此時可能沒有消息,或者可能有完整的消息,或者可能有部分多條消息。這就是TCP的工作原理。

如果你的消息是真正的以null結尾的,你需要像這樣讀取它們,等待null終止符到來,然後處理它之前的任何消息。例如,你可以使用TIdIOHandler.ReadLn()TIdIOHandler.WaitFor()方法用於該目的:

procedure TSimpleSslServerForm.TCPServerExecute(AContext: TIdContext); 
var 
    RxBufStr: string; 
begin 
    RxBufStr := AContext.Connection.IOHandler.ReadLn(#0); 
    ... 
end; 

procedure TSimpleSslServerForm.TCPServerExecute(AContext: TIdContext); 
var 
    RxBufStr: string; 
begin 
    RxBufStr := AContext.Connection.IOHandler.WaitFor(#0); 
    ... 
end; 
+0

由於雷米。 WaitFor(#0)方法提供了正確的結果。 –