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
相关产品推荐
相关产品推荐

