TidTcpClient ReadBytes 方法不返回数据
TidTcpClient ReadBytes method not returning data
我的客户端收到字符串,其中字符串的前 4 个字符定义消息的长度。
示例字符串:0034PDCS00001700kg00000000kg00001700kg
- 消息长度为34
- 消息为PDCS00001700kg00000000kg00001700kg
我发现当使用 TidTcpClient.ReadString 方法或 ReadBytes 方法时读取被阻止,即使有足够的数据。
我不确定我做错了什么。有人可以给我建议吗?
FClient.IOHandler.ReadBytes(Buffer, 4, False);// this gets the length OK
len := BytesToString(Buffer).ToInteger;
FClient.IOHandler.ReadBytes(Buffer, len, True);// this blocks and doesn't move on
sReceive := BytesToString(Buffer);
当我测试时,您展示的内容对我来说非常有效。长度和数据被正确读取,没有阻塞。所以发生了其他事情,要么接收到的数据不是您在此处显示的数据,要么问题出在您未显示的另一段代码中。
无论如何,您可以通过使用 ReadString()
而不是 ReadBytes()
来读取两个值来简化您显示的代码:
len := FClient.IOHandler.ReadString(4).ToInteger;
sReceive := FClient.IOHandler.ReadString(len);
我的客户端收到字符串,其中字符串的前 4 个字符定义消息的长度。
示例字符串:0034PDCS00001700kg00000000kg00001700kg
- 消息长度为34
- 消息为PDCS00001700kg00000000kg00001700kg
我发现当使用 TidTcpClient.ReadString 方法或 ReadBytes 方法时读取被阻止,即使有足够的数据。
我不确定我做错了什么。有人可以给我建议吗?
FClient.IOHandler.ReadBytes(Buffer, 4, False);// this gets the length OK
len := BytesToString(Buffer).ToInteger;
FClient.IOHandler.ReadBytes(Buffer, len, True);// this blocks and doesn't move on
sReceive := BytesToString(Buffer);
当我测试时,您展示的内容对我来说非常有效。长度和数据被正确读取,没有阻塞。所以发生了其他事情,要么接收到的数据不是您在此处显示的数据,要么问题出在您未显示的另一段代码中。
无论如何,您可以通过使用 ReadString()
而不是 ReadBytes()
来读取两个值来简化您显示的代码:
len := FClient.IOHandler.ReadString(4).ToInteger;
sReceive := FClient.IOHandler.ReadString(len);