-->

印TCP - 在一个循环中读取数据(Indy TCP - Read data in a loop)

2019-07-29 17:58发布

TCP服务器的时间可持续发送数据帧每隔8ms。 我想程序能够接收这些数据帧的客户端。 有没有在印第安纳波利斯9任何程序知道是否有在缓冲区中可用的数据?

我目前的计划是如下(我使用一个线程):

procedure TThreadRead.Execute;
var
  buffer: array [0..755] of byte;
  //s1: string;
  //i: integer;
begin
  IdTCPClient1.RecvBufferSize:= 756;
  IdTCPClient1.Connect;
  while Terminated = false do
  begin
    if IdTCPClient1.InputBuffer.Size = 0 then
       IdTCPClient1.ReadFromStack(True,0,False);
    while IdTCPClient1.InputBuffer.Size > 0 do
    begin
       ReadBuffer(buffer, FClient.InputBuffer.Size);
       //s1:= '';
       //For i:=0 To Length(buffer)-1 Do
       //  s1:=s1+IntToHex(Ord(buffer[i]),2); //Read values-->global var
       //Form1.Memo1.Text:=s1;
    end;
  end;
end;

是否有继续读取TCP数据(如在UDP onread事件)的任何更有效的解决方案?

提前致谢。

Answer 1:

TIdTCPClient不是异步组件。 当数据到达它不会告诉你。 你需要使用一个定时器或一个线程来定期轮询新的数据套接字( TIdUDPServer使用内部线程来触发其OnUDPRead事件),例如:

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdTCPClient1.Connect;
  Timer1.Enabled := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.Enabled := False;
  IdTCPClient1.Disconnect;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  s1: string;
begin
  s1 := IdTCPClient1.CurrentReadBuffer;
  ...
end;

随着中说, CurrentReadBuffer()一般是不使用的最佳选择。 通常,你会做一些更喜欢这个:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;

  IdTCPClient1.ReadFromStack(True, 0, False);

  while IdTCPClient1.InputBuffer.Size > 0 do
  begin
    // read one complete frame and process as needed ...
  end;

  Timer1.Enabled := True;
end;

更新:鉴于有关框架结构和您切换到一个线程新的信息,你应该不是这样做:

procedure TThreadRead.Execute;
var
  buffer: array of Byte;
  numbytes: Integer;
begin
  SetLength(buffer, 0);
  IdTCPClient1.Connect;
  try
    while not Terminated do
    begin
      numbytes := StrToInt('$' + IdTCPClient1.ReadString(8)) - 8;
      if numbytes <> Length(buffer) then
        SetLength(buffer, numbytes);
      if numbytes > 0 then
        IdTCPClient1.ReadBuffer(buffer[0], numbytes);
      // process buffer up to numbytes as needed...
    end;
  finally
    IdTCPClient1.Disconnect;
  end;
end;


文章来源: Indy TCP - Read data in a loop