我正在使用Indy客户端来读取服务器发送给我的(客户端)消息。它一次性向我发送512字节的数据。这512个字节的数据由两种数据类型(Word和String)组成。例如,它先发送2字节的Word,然后再发送2字节的Word,然后是50字节的String等等。我尝试使用以下代码来解决这个问题:
var BufferArray : Array[0..512] of Byte;
if IdTCPClient1.IOHandler.InputBufferIsEmpty then
begin
if IdTCPClient1.IOHandler.CheckForDataOnSource(1000) then
begin
Edit1.Text := idtcpclient1.IOHandler.ReadBytes(BufferArray ,512, true);
end;
end;
我在编辑器中遇到了错误,具体是在这行代码 Edit1.Text := idtcpclient1.IOHandler.ReadBytes(BufferArray ,512, true); 中。错误提示为:实际参数和形式参数的类型必须相同。
我想将整个 512 字节存储到 Edit1.Text 中,然后再对这些数据进行操作。请帮助我从服务器获取全部 512 字节的数据,并检查我的方法是否正确。
更新:备选方案
我正在使用以下方法读取单词和字符串值。
WordArray : array[0..5] of word;
if IdTCPClient1.IOHandler.InputBufferIsEmpty then
begin
if IdTCPClient1.IOHandler.CheckForDataOnSource(1000) then
begin
i := 0;
while i < 6 do //Read all the words
begin
//Fill WORD data in array
WordArray[i] := (IdTCPClient1.Socket.ReadWord(True));
end;
end;
end;
对于字符串类似的操作,可以采用类似的方法:
WordArray[i] := (IdTCPClient1.Socket.ReadString(50));
这个方法很好用,但在读取所有循环数据时必须保持连接处于打开状态。如果连接在此期间中断,我会丢失所有数据并不得不再次从服务器请求整个数据包。
BufferArray
,将声明更改为var BufferArray: TBytes;
。 - TLama