加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使用Delphi中的Indy Client从服务器读取所有字节?

发布时间:2020-12-15 09:47:22 所属栏目:大数据 来源:网络整理
导读:我正在使用Indy客户端来读取服务器发送给我的消息(客户端).它一次性向我发送512字节的数据.这512字节的数据由两种数据类型(Word和String)组成.例如,它发送2个字节的字,然后再发送2个字节的字,然后发送50个字节的字符串,依此类推.我正在尝试使用代码来解决这
我正在使用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,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));

这很好,但我必须在循环中读取所有数据时保持连接打开.如果在连接之间,我会丢失所有内容,并且必须再次从服务器请求整个包.

解决方法

除非你准确地描述你所拥有的文档中的内容,否则很难回答你.到目前为止,我们知道您的512B数据包由6个字和10x50B字符串组成.所以,以此为出发点,直到你告诉我们更多:

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  Buffer: TBytes;
  WordArray: array[0..5] of Word;
  StringArray: array[0..9] of AnsiString;
begin
  if IdTCPClient1.IOHandler.InputBufferIsEmpty then
  begin
    if IdTCPClient1.IOHandler.CheckForDataOnSource(1000) then
      IdTCPClient1.IOHandler.ReadBytes(Buffer,False);

    for I := 0 to High(WordArray) do
    begin
      WordRec(WordArray[I]).Hi := Buffer[I * 2];
      WordRec(WordArray[I]).Lo := Buffer[I * 2 + 1];
    end;
    for I := 0 to High(StringArray) do
      SetString(StringArray[I],PAnsiChar(@Buffer[I * 50 + 12]),50);

    // here you have the arrays prepared to be processed
  end;
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读