开发环境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
tcpclient:=TIdTCPClient.Create();
with tcpclient do
begin
Host := Form1.edtIP.Text;
Port := StrToIn
Delphi TIdTCPClient使用问题及解决办法

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





