gpt4 book ai didi

tcp - Indy TCP - 循环读取数据

转载 作者:可可西里 更新时间:2023-11-01 02:33:34 25 4
gpt4 key购买 nike

TCP 服务器每 8 毫秒连续发送一次数据帧。我想编写一个能够接收这些数据帧的客户端。 Indy 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事件)?

提前致谢。

最佳答案

TIdTCPClient 不是异步组件。它不会告诉您数据何时到达。您需要使用 Timer 或 Thread 定期轮询套接字以获取新数据(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;

关于tcp - Indy TCP - 循环读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10881685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com