如何在Delphi和Indy 10.6上取消tcpclient流

时间:2017-05-22 21:11:41

标签: delphi tcpclient indy

我正在设置一个TCP客户端/服务器应用程序,在那里我将一个头记录发送到服务器(可能还有一个文件流),它将响应一个响应记录(可能还有一个文件流)。

但有时候,我会遇到流错误(双方),我似乎无法用print(string.match(url, "(%d+)/?$")) 清除它们。

以下是一些示例代码:

客户端

IOHandler.InputBuffer.Clear()

服务器端

var
  FS: TFileStream;

FClient.IOHandler.LargeStream := True;
FS := TFileStream.Create(FileName, fmOpenRead);
try
  FClient.IOHandler.Write(FS, FS.Size, True); //send the file w/size
finally
  FreeAndNil(FS);
end;

无论是服务器端还是客户端接收端,当我执行var FS: TFileStream; //in ServerExecute FS := TFileStream.Create(FileName, fmCreate Or fmOpenWrite); //create the file IdContext.Connection.IOHandler.LargeStream := True; try if IdContext.Connection.IOHandler.InputBufferIsEmpty then //if no data yet if not IdContext.Connection.IOHandler.CheckForDataOnSource(30000) then begin //read timeout SErr := 'read time out, stream not received!'; Exit; end; IdContext.Connection.IOHandler.ReadStream(FS, -1, False); //read stream with size specified at start of stream if FS.Size <> (expected file size sent in header packet) then begin SErr := 'not all stream bytes received!'; Exit; end; finally FreeAndNil(FS); //close the file end; 时,它会间歇性地冻结流(可能是因为传输计数小于预期的字节数)。一旦我检测到超时条件,我将清除输入缓冲区,但从那时起它就像传输不同步一样;即我发送一个命令包,然后发送文件包,但是我得到一个错误,就像它先收到文件包一样,并且它会继续为下面的失败重试做这个。

0 个答案:

没有答案