Delphi TIdTCPClient的使用问题

在Delphi10.3.3环境下使用TIdTCPClient进行短连接通信时,遇到服务端返回数据长度不确定的问题。使用Socket.ReadBytes(dat,-1,False)读取数据,当数据超过2920字节时,读取不足。解决办法包括:调整ReadBytes的参数,避免Already connected异常,以及循环调用ReadBytes确保完整读取数据。" 135638917,7337247,多模态大模型实战:从概念到应用,"['人工智能', '语言模型', '深度学习', '多模态数据', '数据处理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发环境Delphi10.3.3

使用TIdTCPClient写了一个客户端小例子,使用网络调试助手作为服务端(设置接收到客户端信息会自动返回数据)。

通讯模式:短连接。客户端连接--发送---等待数据---接收---断开。此例子中客户端不知道返回信息长度是多少。

问题:由于不确定服务端返回数据多少,所以使用Socket.ReadBytes(dat,-1,False); -1:表示一直读取直到超时。本以为像ClientSocket那样有多少数据就能读到多少,结果试验了不同长度的数据,读取到的长度也不一样。1000多个字节没问题,超过2920就会出现读取不够的情况(经常在2920出问题,但也不全是)。读取结束后disconnect,再次connect就会抛出Already connected异常。

如果Socket.ReadBytes(dat,-1,False);  第二个参数设置为正数,表示要读取的字节数,如果实际返回的小于参数则会一直等待到readtimeout,然后抛出超时异常。如果大于参则读取成功。但这两种情况都是导致再次connect抛出Already connected异常。

解决Already connected异常的办法是idtcpclnt1.Socket.InputBuffer.Clear;

解决读取数据不够的办法是循环调用Socket.ReadBytes(dat,-1,False); 

改进后如下:

procedure TReadThread.Execute;
var
  dat:TIdBytes;
  msg:AnsiString;
  count:Integer;
  tcpclient:TIdTCPClient;
begin
  FreeOnTerminate:=true;
  try
   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小米很好吃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值