You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi Berlin 10.1中TidTcpClient接收字节数组方法咨询

在Delphi Berlin 10.1中替代TIdTcpClient的ReadBuffer()方法

刚好对Indy的版本变化比较熟悉,我来给你梳理下解决方案:

Delphi Berlin 10.1使用的是Indy 10.x版本,这个版本里ReadBuffer()方法已经被ReadBytes()替代了,它属于TIdIOHandler类,你可以通过TIdTcpClient.IOHandler属性调用这个方法,完全可以实现原来接收字节数组的需求。

两种常见场景的实现方式

1. 已知需要读取的字节数

这种情况直接替代原来的ReadBuffer()逻辑即可,代码示例如下:

var
  Buffer: TIdBytes;
  RequiredByteCount: Integer;
begin
  RequiredByteCount := 512; // 假设你知道要读取512字节
  SetLength(Buffer, RequiredByteCount);
  // 读取指定数量的字节到Buffer中
  IdTCPClient1.IOHandler.ReadBytes(Buffer, RequiredByteCount);
  
  // 后续可以直接使用Buffer,如需转成原生Byte数组,可做如下转换:
  // var RawBuffer: TArray<Byte>;
  // RawBuffer := TArray<Byte>(Buffer);
end;

2. 预先不知道需要读取的字节数

这种情况要根据你的通信场景选择不同的参数:

  • 如果只想读取当前IOHandler缓冲区中所有可用的字节,给ReadBytes()的第二个参数传入-1即可:
var
  Buffer: TIdBytes;
begin
  // 读取当前所有可用字节,Buffer会自动调整长度
  IdTCPClient1.IOHandler.ReadBytes(Buffer, -1);
  
  ShowMessageFmt('成功读取%d字节数据', [Length(Buffer)]);
end;
  • 如果需要一直读取直到对方关闭连接,在传入-1的同时,将第三个参数AReadUntilDisconnect设为True:
var
  Buffer: TIdBytes;
begin
  // 持续读取直到连接断开
  IdTCPClient1.IOHandler.ReadBytes(Buffer, -1, True);
  
  ShowMessageFmt('连接已关闭,累计读取%d字节', [Length(Buffer)]);
end;

额外说明

  • TIdBytes是Indy提供的动态字节数组类型,和Delphi原生的TArray<Byte>完全兼容,你可以直接互相转换使用。
  • 如果你的通信协议是“先发送数据长度,再发送数据内容”的模式,建议先读取长度值,再根据长度读取对应字节数,这种方式比盲目读取更可靠。

内容的提问来源于stack exchange,提问作者artemk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:26:00