我正在设置一个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;
时,它会间歇性地冻结流(可能是因为传输计数小于预期的字节数)。一旦我检测到超时条件,我将清除输入缓冲区,但从那时起它就像传输不同步一样;即我发送一个命令包,然后发送文件包,但是我得到一个错误,就像它先收到文件包一样,并且它会继续为下面的失败重试做这个。