【发布时间】:2012-11-30 02:49:47
【问题描述】:
我正在使用 Indy 客户端来读取服务器发送给我(客户端)的消息。它一口气向我发送了 512 字节的数据。这 512 字节的数据由两种数据类型(Word 和 String)组成。例如,它发送 2 个字节的字,然后再发送 2 个字节的字,然后是 50 个字节的字符串,依此类推。我正在尝试以下代码来解决这个问题:
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);错误:实际和形式 var 参数的类型必须相同。
我使用的方法是否正确。我想在 Edit1.Text 上存储整个 512 个字节,然后对这些数据做任何我想做的事情。请帮助我从服务器获取所有 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;。 -
是的,也一样。有效。谢谢。现在我还有更多问题。我如何遍历这个 BufferArray?我想将它的所有内容存储到一个字符串数组中。
-
@TLama - 更新了我的问题。我的新方法对吗?
-
对不起,我放弃这个问答;你要我解决你客户的整个沟通部分。那就是我没有时间也没有动力。您发布的文档没有说明单词值的字节顺序,也没有说明字符串的发送或终止方式(我们向您询问的所有内容)。对于您的更新,如果您以前想读取整个 512B 数据包,为什么现在尝试从套接字读取字值?你有没有看过我的回答并理解它的用途(到上次更新时,我已经修改了字值的字节顺序)?
-
@Tlama 但是为什么你用那种乏味的显式方式来反转订单? docwiki.embarcadero.com/Libraries/XE2/en/System.Swap
标签: delphi delphi-xe2 indy indy10