繁体   English   中英

Indy TCPServer缺少数据。 德尔福XE2

[英]Missing data from indy TCPServer. Delphi XE2

我有一个使用TIdTCPServer的应用程序。 我成功地将以null结尾的消息作为以null结尾的字符串发送到服务器(Delphi XE2,它随附的Indy程序包)。 OnExecute过程如下:

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条消息)和/或数据不正确:<38> 7月10日09:37:39 cilad71 QJRN:ope = JOB已更改date = 10/07/15时间= 07:59:26 sys = CILAD71用户= GCOX作业= QZSOSIGN作业n = ipadr = 192.168.5.121 pgm = QZSOSIGN pgmlib = QSYS日期= 07/10/15时间= 07:59:26用户= GCOX动作=配置文件已更改jobname = QZSOSIGN jobnumber = 189191 jobusername = QUSER jobd = QZBSJOBD ipaddress = 192.168.5.121%

15年7月10日时间= 08:01:25用户= GCOX操作=已更改配置文件作业名称= QZSOSIGN作业编号= 189191作业用户名称= QUSER作业= QZBSJOBD ip地址= 192.168.5.121%

<38> 7月10日09:37:39 cilad71 QJRN:ope = JOB已更改日期= 15/07/15时间= 08:01:35 sys = CILAD71用户= GCOX作业= QPADEV000D作业= ipadr = 192.168.5.121 pgm = QWTPIIPP pgmlib = QSYS日期= 15/10/15时间= 08:01:35用户= GCOX操作= START作业名称= QPADEV000D作业编号= 189401作业用户名称= GCOX作业= QDFTJOBD ipaddress = 192.168.5.121%

粗体事件缺少数据。

我也看到TIdUDPServer组件的相同行为。 我看到的唯一区别是,对于UDP,正确接收所有数据所需的延迟为100 ms,而对于TCP服务器,消息之间的延迟小于200 ms始终会导致数据丢失。 对于UDP,当发送到Windows事件服务时,该事件将显示在相应的Windows日记中,因此无需延迟,我可以正确看到所有事件。

谢谢,杰夫·考克斯

您显示的TIdTCPServer代码未从套接字读取以空值结尾的消息。 很简单,就是读任何原始数据恰好是目前在该特定时刻的插座上。 那时可能没有消息,或者可能有完整的消息,或者可能有部分多条消息。 这就是TCP的工作方式。

如果您的消息是真正的以零结尾的消息,则您需要这样阅读它们,即等待空终结符到达,然后对其之前的内容进行处理。 例如,您可以为此使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM