“读取超时”异常在50%的连接请求的ReadBytes(B1,600,False)处引发,在ReadBytes(B3,5,False)发生20%异常。因此,只有少数几个连接正确完成。我知道在客户端生成600字节的过程不会超过2秒。顺便说一句,如果我将ReadTimeout从10000增加到20000,则结果没有任何改善。大约有50个客户端通常在一天中的不同时间进行连接,因此我们没有拥挤的服务器。设置ReadTimeout的目的是在出现一些问题时尽快关闭连接。我的代码是否有问题,还是应该在其他地方搜索该问题?
procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
var
Log: TConnectionLog;
B1, B2, B3: TIdBytes;
begin
try
try
Log := TConnectionLog.Create;
Log.ConnectDateTime := Now;
Log.ClientIP := AContext.Binding.PeerIP;
AContext.Connection.IOHandler.ReadTimeout := 10000;
AContext.Connection.IOHandler.ReadBytes(B1, 600, False);
AContext.Connection.IOHandler.ReadTimeout := IdTimeoutDefault;
Log.Bytes600ReceiveDateTime := Now;
SetLength(B2, 200);
AContext.Connection.IOHandler.Write(B2);
Log.Bytes200SendDateTime := Now;
AContext.Connection.IOHandler.ReadTimeout := 15000;
AContext.Connection.IOHandler.ReadBytes(B3, 5, False);
AContext.Connection.IOHandler.ReadTimeout := IdTimeoutDefault;
Log.Bytes5ReceiveDateTime := Now;
except
on E: Exception do
begin
Log.ExceptionMessage := E.Message;
raise;
end;
end;
finally
TThread.Synchronize(nil,
procedure
begin
SaveLog(Log);
end);
Log.Free;
end;
end;
Delphi 10.2;印第10.6.2;网络类型:2G / GPRS
根据雷米·勒博(Remy Lebeau)的指导,我做了很多天的网络流量监控,发现问题出在网络质量低下,在这种情况下,大小大于100字节的TCP段通常会丢失!